位运算符
运算符 | 运算 | 范例 |
<< | 左移 | 3<<2=12à3*2*2=12 |
>> | 右移 | 3>>1=1à3/2=1 |
>>> | 无符号右移 | 3>>>1=1à3/2=1 |
& | 与运算 | 6&3=2 |
| | 或运算 | 6|3=7 |
^ | 异或运算 | 6^3=5 |
~ | 反码 | ~6=7 |
位运算是直接对二进制运算
既然是位运算,数据都要以二进制表示,且以其补码表示
1.与运算----& 有0则0
例子:3&4=0
分析:
3的二进制补码为: 00000000 00000000 00000000 00000011
4的二进制补码为: 00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
-----------------------------------------------------------------
00000000 00000000 00000000 00000000
结果是0
2.或运算----| 有1则1
例子 3|4 =7
分析:
3的二进制补码为: 00000000 00000000 00000000 00000011
4的二进制补码为: 00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
------------------------------------------------------------------
00000000 00000000 00000000 00000111
结果是7
3.异或运算----^ 相同则0,不同则1
例子:3^4=7
分析:
3的二进制补码为: 00000000 00000000 00000000 00000011
4的二进制补码为: 00000000 00000000 00000000 00000100
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000100
--------------------------------------------------------------
00000000 00000000 00000000 00000111
结果是7
异或运算的特点:一个数据对另一个数据异或两次,该数本身不变。
4.按位取反运算符----~ 0变1 , 1变0
例子: ~3=-4
分析:
3的二进制补码为: 00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000011
~ 11111111 11111111 11111111 11111100(都是补码)
但我们看到的都是原码的十进制表示,所以先将其转化为原码,再计算出其十进制
补码:11111111 11111111 11111111 11111100
反码:11111111 11111111 11111111 11111011
原码:10000000 00000000 00000000 00000100
结果是-4
5.左移运算符----<< 左边最高位丢弃,右边补齐0
例子: 3<<2=12
-3<<2=-12
分析:
3<<2=12
3的二进制补码为: 00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000011
(00)000000 00000000 00000000 0000001100
结果是12
-3<<2=-12
-3的二进制原码为: 10000000 00000000 00000000 00000011
-3的二进制反码为: 11111111 11111111 11111111 11111100
-3的二进制补码为: 11111111 11111111 11111111 11111101
11111111 11111111 11111111 11111101
(11)111111 11111111 11111111 1111110100
补码为:111111 11111111 11111111 1111110100
反码为:111111 11111111 11111111 1111110011
原码为:100000 00000000 00000000 0000001100
结果是 -12
简便计算方法:把<<左边的数据*2的移动次幂
3<<2 ---> 3*2^2=12
6.右移运算符---->> 如果最高位是0左边补齐0 , 如果最高位是1左边补齐1
例子: 24>>2=6
-24>>2=-6
分析:
A:
24>>2=6
24的二进制补码为: 00000000 00000000 00000000 00011000
00000000 00000000 00000000 00011000
0000000000 00000000 00000000 000110(00)
结果是6
B:
-24>>2=-6
-24的二进制原码为: 00000000 00000000 00000000 00011000
-24的二进制反码为: 11111111 11111111 11111111 11100111
-24的二进制反码为: 11111111 11111111 11111111 11101000
11111111 11111111 11111111 11101000
1111111111 11111111 11111111 111010(00)
补码为: 1111111111 11111111 11111111 111010
反码为: 1111111111 11111111 11111111 111001
原码为: 1000000000 00000000 00000000 000110
结果是 -6
简便计算方法:把>>左边的数据 / 2的移动次幂
24>>2 ---> 24/(2^2)=6
7.无符号右移---->>> 无论最高位是0还是1,左边补齐0
例子 24>>>2=6
-24>>>2=6
分析:
A:
24>>>2=6
24的二进制补码为: 00000000 00000000 00000000 00011000
00000000 00000000 00000000 00011000
0000000000 00000000 00000000 000110(00)
结果是6
B:
-24>>>2=6
-24的二进制原码为: 00000000 00000000 00000000 00011000
-24的二进制反码为: 11111111 11111111 11111111 11100111
-24的二进制反码为: 11111111 11111111 11111111 11101000
11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00)
补码是0011111111 11111111 11111111 111010,
表示是正数,其原码反码补码都相同
原码是 0011111111 11111111 11111111 111010
结果是 1073741818