原码
数字在计算机中以二进制表示, 8 位的字长, 最高位是符号位, 正数为 0, 负数为 1. 比如, 3 为 0000 0011; -3 为 1000 0011
注意, Java 中 int 为 32 位 3 的 16 进制表示为
3
,-3 的 16 进制为 fffffffd.
反码
正数的反码和原码相同
负数的反码为符合位不变, 其余按位取反
3 为 0000 0011; -3 为 1111 1100
补码
正数的补码和原码相同
负数的补码为反码 + 1.
3 为 0000 0011; -3 为 1111 1101
与 (&)
按位与, 位数对齐, 全部为 1 的结果为 1.
- 1&2 == 0 2&3 == 2
- 0000 0001 0000 0010
- 0000 0010 0000 0011
- --------- ---------
- 0000 0000 0000 0010
或 (|)
按位或, 位数对齐, 只要有一个为 1, 则结果为 1
- 1|2 == 3 2|3 == 3
- 0000 0001 0000 0010
- 0000 0010 0000 0011
- --------- ---------
- 0000 0011 0000 0011
非 (~)
按位取反
- ~1 == -2
- 0000 0001
- ---------
- 1111 1110
我们直到负数的表示为反码 + 1. 所以, 该结果中的反码为
(1111 1110 - 0000 0001)=1111 1101
, 则绝对值原码为 0000 0010, 即 2 即结果为 - 2.
异或 (^)
相同为假, 不同为真
- 1^2 == 3 2^3 == 1
- 0000 0001 0000 0010
- 0000 0010 0000 0011
- --------- ---------
- 0000 0011 0000 0001
左移 <<
所有的位左移, 低位即右侧补 0.
- 1<<2 == 4 3<<3 == 24
- 0000 0001 0000 0011
- 0000 0100 0001 1000
左移几位则相当于 10 进制乘以 2 的多少次方所以
1<<2==1*2*2==4; 3<<<3==3*2*2*2==24
右移 >>
正数右移, 高位用 0 补, 负数右移, 高位用 1 补.
- 1>>2 == 0 13>>2 ==3 -3>>2 == -1
- 0000 0001 0000 1101 1111 1101
- --------- --------- ---------
- 0000 0000 0001 0011 1111 1111
无符号右移 >>>
正数无符号右移同右移, 负数无符号右移则高位补 0.
- 1>>>2 == 0 13>>>2 ==3 -3>>>2 == 1073741823
- 0000 0001 0000 1101 fffffffd
- --------- --------- ---------
- 0000 0000 0001 0011 3fffffff
衍生运算符
由位运算操作符衍生而来的有:
&= 按位与赋值
|= 按位或赋值
^= 按位非赋值
>>= 右移赋值
>>>= 无符号右移赋值
<<= 赋值左移
来源: https://www.cnblogs.com/woshimrf/p/operation-bit.html