位运算技巧总结
文章创作于
231130
,250922
迁移至博客。更多 bit 处理技巧可尝试一下:站内文章CSAPP LAB-1 位操作。
逻辑表达式
任意的命题公式都可以仅包含 或 的命题公式等价代换。
与运算和或运算(掩码)
单片机中寄存器设置常用。
1 | /* |
在 站内文章计算汉明重量的两个技巧性算法 中,介绍了 Brian Kernighan 算法中的与运算技巧, x
和 x-1
进行与运算所得的结果为 x
删去其二进制表示中最右侧的 1 的结果。
异或
异或满足交换律和结合律。
\begin{align} a\oplus 0&=a \\ a\oplus a &= 0 \\ a\oplus b &= b\oplus a \\ (a \oplus b) \oplus c &= a \oplus( b \oplus c) \end{align}
两个数异或的结果意味着:
- 如果二进制结果中第 i 位为 1,说明这两个数在第 i 位上不相同
- 如果二进制结果中第 i 位为 1,说明这两个数在第 i 位上相同
我们可以使用异或实现一些函数:
1 | /* 判断数字是否相等 |
补码
一个补码表示的二进制数 x
,通过「取反加一」的方式得到其补码表示的 -x
。
取反加一得到自身的特殊情况:
TMin
取反加 1 仍得到TMin
。符号位前后都是 1- 0 取反加 1 得到 0。符号位前后都是 0。
至于其它数 x
,取反加一得到的 -x
的符号位将会变化。
那么,加上异或的判断数字相等的特性,我们可以:
- 得出结论 x 不为 0 或 TMin 时,
(~x+1)^x
结果的符号位为 1。 - 验证一个数是否为 TMin、TMax
取出一个整数的二进制表示中的最低位
快速计算补码的非有两种思考方式:
- 补码的非
-x==~x+1
- 找出数 x 中最右边的为 1 的位(只要 x 不是 0,总能找到),将这个 1 的左边所有的位取反。
根据第二种思考方式,我们可以得出:取出一个整数的二进制表示中的最低位 lowbit(x) 可以通过 x&-x
得到。
例子
数字 10 的二进制表示: 0b01010
数字 -10 的二进制表示:0b10110
5&-5
的结果: 0b00010
该技巧的应用文章:站内文章在线性时间内找出只出现 1 次的数字、站内文章树状数组上手了就十分简单。
计算一个数的补码表示至少需要多少比特
1 | /* howManyBits - return the minimum number of bits required to represent x in |
后记
- 需消化「计算一个数的补码表示至少需要多少比特」的内容
本文参考
- 研究生课程《CSAPP》相关实验与笔记
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 半方池水半方田!
评论