C++

C++位运算

Posted by Xsp on June 7, 2017

设置bit

int mask = 1 << x;
number |= mask;

确定想将某一位设置为1,只需要将mask的对应位设置为1,然后位或运算。所以,以上代码会设置number的右数第x位为1(x从0开始)。

清除bit

number &= ~(1 << x);

确定想将某一位设置为0,需要mask的对应位置为0,其他位置为1,然后位与运算。那么可以先将mask对应位置为1,然后位取反。

切换bit

number ^= 1 << x;

想toggle某一位的话,那就是位异或了,毕竟相同为0,不同为1。

检查bit

bit = (number >> x) & 1;

设置和清除

number ^= (-x ^ number) & (1 << n);

以上代码将第n位设置为x。

假设 number = 5(0000...0101)。n = 1,1 << n = 0000...0010
x = 0:
-x 为 1000...0000;
-x ^ number = 1000...0101;
(-x ^ number) & (1 << n) = 0000...0000

x = 1:
-x 为 1111...1111;
-x ^ number = 1111...1010;
(-x ^ number) & (1 << n) = 0000...0010

...

这个有点复杂啊。。。

bitset标准库

bitset<32> bitvec4("1100"); // bits 2 and 3 are 1, all others are 0
bitvec4.set(0)      // 将bit 0 置为1
bitvec4.reset(0)    // 复位bit 0

移位运算

左移(«):在右侧补0。

右移(»):如果是unsigned,左侧补0;否则补符号位或0(与环境相关)。

关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算用于处理无符号类型 – 《C++ primer th5》

其他

关于负数,反码是除符号位,其他位按位取反。补码是反码+1。

所有的位运算的计算都是用补码。

参考: