快速理解位运算:
- 位运算比其他运算(加减乘除)更加底层,所以运算的更快,但是不是所有场景都可以用
- 位运算只针对整数(带符号),小数进行位运算会先自动转为整数,再进行计算
-
数字的表示
将我们一般使用的十进制整数转换为二进制,其他位数补0,这样就有32位了,正数位31为0,负数位31为1,这样就可以表示正负数了。
位运算
- 或|(一位为1即为1)
1001
0011
结果:1011 - 与&(每位为1才为1)
1001
0011
结果:0001 - 异或^(每位不同才为1)
1001
0011
结果:1010 - 非~(取反)
1001
结果:0110 - 左移<<(向左移动,用0补位)
3<<2
0000 0000 0000 0000 0000 0000 0000 0011
左移2位
00 0000 0000 0000 0000 0000 0000 0011
用0补位
0000 0000 0000 0000 0000 0000 0000 1100 - 带符号右移>>
- 负数右移:-3>>2
-3的32位:1000 0000 0000 0000 0000 0000 0000 0011
1、保持31位(符号位)不变,取反:
1111 1111 1111 1111 1111 1111 1111 1100
2、加1:
1111 1111 1111 1111 1111 1111 1111 1101
3、右移2位:
1111 1111 1111 1111 1111 1111 1111 11
4、高位补1:
1111 1111 1111 1111 1111 1111 1111 1111
5、保留符号位取反:
1000 0000 0000 0000 0000 0000 0000 0000
6、加1:
1000 0000 0000 0000 0000 0000 0000 0001
结果:1000 0000 0000 0000 0000 0000 0000 0001 -----(-1) - 正数右移:3>>2
3的32位:0000 0000 0000 0000 0000 0000 0000 0011
1、右移2位:
00 0000 0000 0000 0000 0000 0000 0000
2、高位补0:
0000 0000 0000 0000 0000 0000 0000 0000
结果:0000 0000 0000 0000 0000 0000 0000 0000 -----(0)
- 不带符号右移>>> --永不为负
-3>>>2
-3的32位:1000 0000 0000 0000 0000 0000 0000 0011
向右移动2两位:
10 0000 0000 0000 0000 0000 0000 0000
高位补0:
0010 0000 0000 0000 0000 0000 0000 0000
结果:0010 0000 0000 0000 0000 0000 0000 0000 -----(1073741823)