如何设置、清除和切换单个位?
使用按位或运算符 ( |) 设置位。
|
number |= 1UL << n;
这将设置的n第 th 位number。n应该为零,如果你想设置1st 位等等n-1,如果你想设置nth 位。
n
number
1
n-1
使用1ULLifnumber比unsigned long; 直到在评估未定义行为的位置移动超过 a 的宽度之后,1UL << n才会发生提升。这同样适用于所有其余示例。1UL << n``long
1ULL
unsigned long
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中。
bit
n在 2 的补码 C++ 实现中,将第 th 位设置为1或0可以通过以下方式实现:
0
number ^= (-x ^ number) & (1UL << n);
如果是,则该位n将被设置,如果x是1,则该位将x被清除0。如果x有其他价值,你会得到垃圾。 x = !!x会将其布尔化为 0 或 1。
x
x = !!x
要使其独立于 2 的补码否定行为(-1所有位都设置,与 1 的补码或符号/幅度 C++ 实现不同),请使用无符号否定。
-1
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。
(number & ~(1UL << n))
(x << n)
通常不要复制/粘贴代码通常也是一个好主意,因此很多人使用预处理器宏或某种封装。