位运算符
所有的数据的运算都是采用补码进行的
又因为正数的远反补码都相同,所以正数可以直接拿二进制来计算。
在此就用正数举例说明位运算符的用法
举例:
int a = 3;
int b = 4;
int 3的补码为:00000000 00000000 00000000 00000011
int 4的补码为:00000000 00000000 00000000 00000100
&:有0则0
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
--------------------------------------------------------------------------
00000000 00000000 00000000 00000000
最终结果为:0
|:有1则1
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
--------------------------------------------------------------------------
00000000 00000000 00000000 00000111
最终结果为:7
^:相同则0,不同则1
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
--------------------------------------------------------------------------
00000000 00000000 00000000 00000111
最终结果为:7
^位异或的特点: 一个数据被另一个数据异或两次,最终结果不变
例:
a ^ b ^ b = a
a ^ b ^ a = b
~:0变1,1变0
~按位取反运算符一般单独使用
~3 --> ~00000000 00000000 00000000 00000011 --> 11111111 11111111 11111111 11111100 [补码]
补码 | 11111111 11111111 11111111 11111100 |
---|---|
反码 | 11111111 11111111 11111111 11111011 |
原码 | 00000000 00000000 00000000 00000100 |
最终结果为:-4
<<左移:左边最高位丢弃,右边补齐0
例:int
3 << 2
左移两位
正数3的二进制位:
00000000 00000000 00000000 00000011
因为正数的原反补码都相同
00000000 00000000 00000000 00000011
去<-- (00)000000 00000000 00000000 00000011 补<-- (00)
00000000 00000000 00000000 0001100
最终结果:12【3 * 2 ^ 2 = 12】
结论:<< 就是将 << 左移的数据 * 2 的移动次幂
>>右移:最高位是0时,左边补齐0;最高位是1时,左边补齐1
例: int
-24 >> 2
首先写出-24的二进制,再写出我们操作的补码
原码 | 10000000 00000000 00000000 00011000 |
---|---|
反码 | 11111111 11111111 11111111 11100111 |
补码 | 11111111 11111111 11111111 11101000 |
11111111 11111111 11111111 11101000
补(11)–>11111111 11111111 11111111 111010(00) -->去
11111111 11111111 11111111 11111010【补码】
补码 | 11111111 11111111 11111111 11111010 |
---|---|
反码 | 11111111 11111111 11111111 11111001 |
原码 | 10000000 00000000 00000000 00000110 |
最终结果为:-6【-24 / 2 ^ 2】
总结:>> 就是将 >> 右移的数据 / 2 的位移次幂
>>>无符号右移:无论最高位是0还是1,左边补齐0
-24的补码:11111111 11111111 11111111 11101000
(00) --> 11111111 11111111 11111111 111010(00) --> 去
00111111 11111111 11111111 11111010【补码】
补码 | 00111111 11111111 11111111 11111010 |
---|---|
反码 | 00111111 11111111 11111111 1111001 |
原码 | 01000000 00000000 00000000 0000110 |
最终结果为:1074721818