在了解Java 按位操作符 移位操作符之前,我们我先了解整数基本类型的 “机器数”、“真值”、“原码”、“反码”、“补码”
1.机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。
如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。
2.真值
由于机器数的第一位是符号位,所以机器数的形式值就不等于真正的数值。即最高位是不参与运算的。真值就是它实际的值
例如,上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。
所以为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
3.原码
就是当前数字的二进制表现形式
正数的原码就是它的本身,如:1 的原码是 1000 0001
负数用最高位是1表示负数 ,如:-1的原码是 1000 0001
注:原码的第一位(最高位)表示数值的符号
4.反码
- 正数的反码跟原码一样
- 负数的反码是负数的原码按位取反(0变1,1变0),符号位不变
1 的原码是 0000 0001
-1的反码是 1111 1110
5.补码(整数的补码是在计算机中的存储形式)
- 正数的补码和原码一样
- 负数的补码是负数的反码加1
1)取反时,符号位不参与取反。
2)加1时,符号位参与加1。
3)特殊补码,即首位为1,其它位全是0。对于这种形式的补码,不要去求它的原码了,求出来也不对,它就表示该类型中的最小负数,比如10000000表示byte类型中的最小负数-128。
1 的原码是 0000 0001
-1的补码是 1111 1111(在计算机中存储形式)
java按位运算符(操作符)
按位运算符是来操作整数基本数据类型中的单个“比特”(bit),即二进制位,位运算符会对两个参数中对 应的位执行布尔代数运算,并最终生成一个结果。
“与”、“位与”(&)
按位“与”操作符,如果两个数的二进制,相同位数都是1,则该位结果是1,否则是0.
“或”、“位或”(|)
按位“或”操作符,如果两个数的二进制,相同位数只要有一个是1,则该位结果是1,否则是0
“异或、“位异或”(^)
按位“异或”操作符,如果两个数的二进制,相同位数有且只有一个是1,则该位结果是1,否则是0(两个数都是1,位结果为0;两个数都是0,位结果也是0)
“非”、“位非”(~)也称为取反操作符
按位“非”操作符,属于一元操作符,只对一个操作数进行操作,(其他按位操作符是二元操作符)。按位“非”生成与输入位相反的值,——若输入0,则输出1,若输入1,则输出0.
移位操作符
移位操作符操作的运算对象也是二进制的“位”。移位操作符只可用来处理整数类型(基本类型的一种)
左移位操作符 (<<)
按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补0)
“有符号”右移位操作符(>>)
按照操作符右侧指定的位数将操作符左边的操作数向右移。“有符号”右移位操作符使用“符号扩展”;若符号位正,则在高位插入0;若符号位负。则在高位插入1。
“无符号”右移位操作符(>>>)
按照操作符右侧指定的位数将操作符左边的操作数向右移,无论正负,都在高位插入0。这一操作符是C或C++中所没有的。