一尘不染

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

c++

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


阅读 275

收藏
2022-01-24

共1个答案

一尘不染

设置一点

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

number |= 1UL << n;

这将设置的n第 th 位numbern应该为零,如果你想设置1st 位等等n-1,如果你想设置nth 位。

使用1ULLifnumberunsigned long; 直到在评估未定义行为的位置移动超过 a 的宽度之后,1UL << n才会发生提升。这同样适用于所有其余示例。1UL << n``long

清除一点

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

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

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

切换一下

XOR 运算符 ( ^) 可用于切换位。

number ^= 1UL << n;

这将n切换number.

检查了一下

你没有要求这个,但我不妨添加它。

要检查一下,请将数字 n 向右移动,然后按位与它:

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

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

将第n位更改为x

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

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

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

要使其独立于 2 的补码否定行为(-1所有位都设置,与 1 的补码或符号/幅度 C++ 实现不同),请使用无符号否定。

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))将清除第nth 位并将(x << n)nth 位设置为x

通常不要复制/粘贴代码通常也是一个好主意,因此很多人使用预处理器宏或某种封装。

2022-01-24