如何设置、清除和切换?
最佳答案
设置一点
使用按位或运算符 ( |
) 设置一个位。
number |= 1UL << n;
这将设置 n
number
的第 1 位。 n
如果你想设置 1
应该为零st 位等最多 n-1
,如果您想设置n
第一点。
使用1ULL
如果number
比unsigned long
更宽;推广1UL << n
直到评估 1UL << n
后才会发生移动超过 long
的宽度是未定义的行为。这同样适用于所有其余示例。
清理一下
使用按位 AND 运算符 ( &
) 清除一位。
number &= ~(1UL << n);
这将清除 n
number
的第 1 位。您必须使用按位 NOT 运算符 ( ~
) 反转位字符串,然后进行 AND 操作。
稍微切换
XOR 运算符 ( ^
) 可用于切换位。
number ^= 1UL << n;
这将切换 n
number
的第 1 位.
检查一下
你没有要求这个,但我不妨添加它。
要检查一位,请将数字 n 向右移动,然后按位与它:
bit = (number >> n) & 1U;
这将把 n
的值放入number
的第 1 位进入变量 bit
.
将第 n 位更改为 x
设置 n
th 位为 1
或0
可以通过以下 2 的补码 C++ 实现来实现:
number ^= (-x ^ number) & (1UL << n);
位n
如果 x
将被设置是 1
,并清除如果 x
是 0
。如果x
有其他值(value),你就会得到垃圾。 x = !!x
将其 bool 化为 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))
将清除n
th 位和 (x << n)
将设置n
第 1 位为 x
.
一般来说,不要复制/粘贴代码也是一个好主意,很多人使用预处理器宏(如 the community wiki answer further down )或某种封装。
关于c++ - 如何设置、清除和切换单个位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30628922/