ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 简答1 ## 0与1 Java中定义的基本类型 ### 原码、反码、补码 我们已经知道了一个 int 型数值是 4 个字节。每个字节有 8 位。但对于一个 int 或者其它整数类型如 (long)的数值而言还要注意的是,它的最高位是符号位。 * 最高位为0表示正数。 * 最高位为1表示负数 #### 原码 将一个数字转换成二进制,就是这个数值的原码 ```java int a = 5; //原码 0000 0000 0000 0101 int b = -3; //原码 1000 0000 0000 0011 ``` #### 反码 分两种情况:正数和负数 * 正数 正数的反码就是原码。 * 负数 负数的反码是在原码的基础上,符号位不变 其它位都取反。 ```java 5 的原码:0000 0000 0000 0101 -3 的原码:1000 0000 0000 0011 -3 的反码:1111 1111 1111 1100 ``` #### 补码 仍然分正数和负数两种情况 * 正数 正数的补码就是原码。 * 负数 负数的补码在反码的基础上加1。 ```java 5 的补码:0000 0000 0000 0101 -3 的反码:1111 1111 1111 1100 -3 的补码: 1111 1111 1111 1101 ``` **计算机在进行数值运算的时候,是通过补码表示每个数值的。** ```bash 5 - 3 = 5 + ( -3 ) 相当于 0000 0000 0000 0101 + 1111 1111 1111 1101 = 1 0000 0000 0000 0010 ``` ![](http://ww1.sinaimg.cn/large/005Ogmrtly1g1v8za0wubj30ug072t8u.jpg) ### 位运算符号 位运算符包含与运算符(&)、或运算符(|)、取反运算符(~)、异或运算符(^)、左移运算符(>>)和右移运算符(<<)。 > 需要注意的是,下面测试用的数据都是 int 类型,int 类型是 4 个字节长度,但是为了方便说明示例中用的数值我都用 1 个字节表示。希望不会给大家造成困扰。 #### & 与 规则:**都为1,则1,否则为0**. ```java 0 & 0 = 0, 0 & 1 = 0, 1 & 1 = 1 ``` #### | 或 规则:**都为0,则0,否则为1**. ```java 0 | 0 = 0, 0 | 1 = 1, 1 | 1 = 1 ``` #### ~ 取反 规则:**对每一位取反, 1变成 0,0 变成 1**. ```java ~5 => 0000 0101 ~ => 1111 1010 ``` #### ^ 异或 规则:**每一位上,如果数值相同为0,不同为1**. ```java 1 ^ 0 = 1, 1 ^ 1 = 0, 0 ^ 0 = 0; ``` #### << 左移 规则 **a << b 将数值 a 的二进制数值从 0 位算起到第 b - 1 位,整体向左方向移动 b 位,符号位不变,低位空出来的位补数值 0**。 ```java 5 << 1 ===> 1000 0000 0000 0101 << 1 = 1000 0000 0000 1010 = 10 ``` #### >> 右移 规则:**a >> b 将数值 a 的二进制数值从 0 位算起到第 b - 1 位,整体向右方向移动 b 位,符号位不变,高位空出来的位补数值 0**。 ```java 5 >> 1 ===> 1000 0000 0000 0101 >> 1 = 1000 0000 0000 0010 = 2 ``` 也就是说 a >> b = a / ( 2 ^ b ) #### >>> 无符号位右移 连同符号位,一起右移 ### 科学计数法