位运算
作者:互联网
前面的话
巧妙使用位运算,在算法方面往往比四则运算要快许多。
左移(<<)
运算规则:
- 将一个数的二进制全部左移若干位,右补若干个0。
- 若要被舍弃的高位为0,则舍弃;
- 若要被舍弃的高位为1,则不舍弃。
若a=15,将其左移2位。即a的二进制数0000 1111,将其左移2位,右补2个0,则变为00111100,即十进制的60。
若a=64,将其左移2位。即a的二进制数为0100 0000,左移一位,1000 0000,左移两位 0000 0001 0000 0000 ,即十进制的256
结论:左移一位相当于该数乘以2,左移两位相当于乘以2^2。
带符号右移(>>)
运算规则:
- 将数的二进制形式把所有的数字向右移动对应的位数,低位移出舍弃。
- 若是正数,高位的空位补0
- 若是负数,高位的空位补1
若a=11,将其右移2位。即0000 1011,将其低位的最后两个数移出,因为该数字是正数,将其右移,高位补2个0,最终为0000 0010,即十进制的2。
结论:正数的右移一位相当于除2,右移n为相当于除以2的n次方。这是取商,余数不要。
右移可以在二分算法中取中间值:
例如: 13>>1 // 6
无符号右移(>>>)
运算规则:
- 按二进制形式把所有的数字向右移动对应的位数,低位移出舍弃,高位的空位补0。
- 没有正负数之分,高位都是补0
按位操作
-
按位与
每一位都为1,结果才是1
8 & 7 // 0 // 1000 & 0111 -> 0000 -> 0
-
按位或
其中一位为1,结果就是1
8 | 7 // 1 // 1000 | 0111 -> 1111 -> 15
-
按位异或
不同为1,相同为0
8 ^ 7 // 15 // 1000 ^ 0111 -> 1111 -> 15 8 ^ 8 // 1000 ^ 1000 -> 0000 -> 0
结论:可以看出按位异或就是不进位加法
标签:右移,0000,运算,舍弃,二进制,左移,1000 来源: https://blog.csdn.net/qq_41257129/article/details/104116745