C++基础笔记13
常见的位运算
基础运算
~ (取反)
| (或)
& (与)
^ (异或)
1 | //取相反数,`e = ~ a + 1` |
<< (左移)
1 | //整体状态向左移动,用0补右边 |
>> , >>>(右移)
1 | //对非负数效果一样,向右移,并且用0来补充左边 |
数学性质
- 对于非负数来说:
- 非负数 << i ,等同于乘以2的i次方
- 非负数 >> i ,等同于除以2的i次方
- 一个数异或自身奇数次还是自身,偶数次则为0
x ^ x = 0; x ^ 0 = x
- 通过异或还可以不用中间变量来交换两个整形
1 | x = x ^ y; |
- 左移1在不溢出的情况下等价于乘以2
右移代表整除2,不过只针对正数,如果是负数,则代表向上取整的整除2
两个质数异或值为1 代表两个数字前后最多相差1
__builtin_clz(n)
计算二进制中最高位1左边0的个数(前导零的个数)__builtin_ctz(n)
计算二进制中末尾0连续的个数(尾随零的个数)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Frite的个人博客!