如何设置、清除和切换单个比特位?

43 浏览
0 Comments

如何设置、清除和切换单个比特位?

如何设置、清除和切换位(bit)?

admin 更改状态以发布 2023年5月23日
0
0 Comments

使用标准 C++ 库: std::bitset

或者使用 Boost 版本: boost::dynamic_bitset

没有必要自己编写:

#include 
#include 
int main()
{
    std::bitset<5> x;
    x[1] = 1;
    x[2] = 0;
    // Note x[0-4]  valid
    std::cout << x << std::endl;
}


[Alpha:] > ./a.out
00010

Boost 版本允许运行时大小的位集,相比于 标准库 编译时大小的位集。

0
0 Comments

设置位(bit)

使用按位或(OR)运算符(|)来设置位(bit)。

number |= 1UL << n;

这将设置number的第n位。如果要设置第1位,n应该为零,如果要设置第n位,n应该为n-1

如果numberunsigned long更宽,请使用1ULL;在评估1UL << n之前,1UL << n的提升不会发生,在其中移位超过long的宽度是未定义行为。对所有其他示例都适用相同的规则。

清除位(bit)

使用按位与(AND)运算符(&)来清除位(bit)。

number &= ~(1UL << n);

这将清除number的第n位。您必须使用按位取反(NOT)运算符(~)反转位字符串,然后进行按位与(AND)运算。

切换位(bit)

按位异或(XOR)运算符(^)可用于切换位(bit)。

number ^= 1UL << n;

这将切换number的第n位。

检查位(bit)

您没有要求这个,但我也可以添加一下。

要检查一个位(bit),将数字n向右移位,然后进行按位与(AND)运算:

bit = (number >> n) & 1U;

这将把number的第n位的值放入变量bit中。

将第n位更改为x

在2's补码的C++实现中,可以通过以下方式将第n位设置为10

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

如果x1,则将设置第n位,如果x0,则将清除第n位。如果x具有其他值,则会得到垃圾值。x = !!x将其布尔化为0或1。

为了让这个操作与2的补码否定行为无关(在1的补码或符号/大小写C++实现中,-1的所有位都设置,与2的补码不同),应该使用无符号取反。

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

或者

unsigned long newbit = !!x;    // Also booleanize to force 0 or 1
number ^= (-newbit ^ number) & (1UL << n);

通常最好使用无符号类型进行可移植的位操作。

或者

number = (number & ~(1UL << n)) | (x << n);

(number & ~(1UL << n))将清除第n位,而(x << n)将将第n位设置为x

一般来说最好不要复制/粘贴代码,因此许多人使用预处理器宏(例如下面的社区wiki答案)或某种封装。

0