一些奇妙的bit操作
学习过程中看到 + 推理出的一些奇妙的位运算相关的操作。顺序尽量有一定推理逻辑, 尽量分组写在一起
听说”hacker’s delight”这本书专门讲这些, 但我还没时间看
- assert
- 默认从右往左是从低位到高位, aka 右边的末尾
+1
的效果: 从右到左第一个0, 按位取反(不够加要一直进位)-1
的效果: 从右到左第一个1, 按位取反(不够减要一直借位)- 快速求补码: 右起第一个1往左, 按位取反
n & n-1
的效果: 最右边的1变0, 因为-1
的效果, 并且可以知道这个被消灭的1的右边都是0N >> 1
在二叉树中相当于N/2向下取整, 以用来找当前节点的父节点- 补码的负等于对该数取补,
-x = (~x + 1)
x | (~x + 1)
从低位1开始, 往高位全部置1
- xor的性质
- x xor y = t 等价于 x xor t = y
CSAPP lab1: datalab tips
- int负数 = 按位取反末位加一:
-x = (~x + 1)
- 减一个数等价于加上这个数的取负
- 对于一些限制使用的操作, 可以通过变换得到
- e.g.
a | b
=~(~a & ~b)
, 或者对于bool,a | b = !(!a & !b)
- e.g.
- 判断相等
!(x^x)
,两个相等的数异或得0, 再用!
运算符转换成bool