一、位运算左移:<<
指的是将对应的十进制先转换成二进制数,然后再根据需要移动几位来进行操作。比如
5<<2指的是将5这个十进制数的二进制位往左移动两位
5的二进制:00000000 00000000 00000000 00000101
左移两位:00000000 00000000 00000000 00010100
变成十进制数20。更简单的理解为:将要进行位运算的正数乘以2的N次方(N的值为要移位的位数),即5<<2就是5×2^2=20
在左移过程中,低位(最右边)用0来补,比如5的二进制左移2位后,右边空两位,整数的符号位是0,那么就用0来补。
例如:-5<<2指的是将-5这个十进制数的二进制位往左移动两位.
5的二进制:00000000 00000000 00000000 00000101
按位取反:111111111 111111111 11111111 11111010
+1得到-5的二进制即:111111111 111111111 11111111 1111 1011
左移两位:111111111 111111111 11111111 11101100
这是负数的补码,变为原来的二进制,按位取反+1
10000000 00000000 00000000 00010110
即为-20,最高位是符号位。更简单的理解为(有待考证,但感觉是对的,~~~~~):将要进行位运算的负数()乘以2的N次方(N的值为要移位的位数),即-5<<2就是-5×2^2=-20
二、位运算符右移:>>
与运算符左移类似,不过区别在于:
负数的移位上,比如-4>>2
4的原码:00000000 00000000 00000000 00000100
反码:111111111 111111111 11111111 11111011
+1:111111111 111111111 11111111 11111100
即-4的二进制码是:111111111 111111111 11111111 11111100
右移两位:111111111 111111111 11111111 11111111
取反加+1:10000000 00000000 00000000 00000001
得出-1,最高位是符号位,符号位不会变化的,1代表负数,0代表整数。
负数右移时,高位(最左边)用符号位来补,即右移的是负数,那么用1;右移的是正数,那么用0。
比如:4>>2
4的原码:00000000 00000000 00000000 00000100
右移两位: 00000000 00000000 00000000 00000001
变成1
三、位运算符无符号右移:>>>
无符号右移,忽略符号位,空位都以0补齐
比如6>>>2
二进制码:00000000 00000000 00000000 00000110
右移两位:00000000 00000000 00000000 00000001
高位(最左边)使用0来补齐的。
比如负数:-6>>>2
6的二进制码:00000000 00000000 00000000 00000110
按位取反+1得到-6的二进制码:111111111 111111111 11111111 11111010
右移两位:001111111 111111111 11111111 11111110
变回去按位取反+1:11000000 00000000 00000000 00000010
即得到1073741822
注:
1.x<<y 相当于 x*2y ;x>>y相当于x/2y
2.如果x是负数,那么x>>>2没有什么算术意义,只有逻辑意义
4的原码:00000000 00000000 00000000 00000100
四、与运算符:&-按位与
如果 4&7 那么这个应该怎么运算呢?
首先我们需要把两个十进制的数转换成二进制
4 : 0000 0100
7 : 0000 0111
在这里要提到一点,1表示true,0表示false
而与运算的时候相同位之间其实就是两个Boolean的运算
全true(1),即为true(1)
全false(0),即为false(0)
一false(0)一true(1),还是false(0)
五、或运算符:|-按位或
以 5|9 为例
5 : 0000 0101
9 : 0000 1001
在做或运算的时候
遇true(1)就是true(1),
无true(1)就是false(0)
六、异或运算符:^-按位异或
以 7^15 为例
7: 0000 0111
15: 0000 1111
在异或的时候
只要相同都是false(0)
只有不同才是true(1)
七、取反运算符:~-按位取反
例: ~15
同样的先变成二进制:15:0000 1111
这个其实挺简单的,就是把1变0,0变1
注意:二进制中,最高位是符号位 1表示负数,0表示正数
参考博客:https://www.cnblogs.com/SunArmy/p/9837348.html