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

标签 c++ c bit-manipulation bitwise-operators

如何设置、清除和切换?

最佳答案

设置一点

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

number |= 1UL << n;

这将设置 n number 的第 1 位。 n如果你想设置 1 应该为零st 位等最多 n-1 ,如果您想设置n第一点。

使用1ULL如果numberunsigned 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 位为 10可以通过以下 2 的补码 C++ 实现来实现:

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

n如果 x 将被设置是 1 ,并清除如果 x0 。如果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/

相关文章:

c++ - 通过查看最后一位来检查数字是否为偶数 - 是否有其他类似的 "tricks"?

algorithm - 快速检查是否设置了奇数位的方法?

c++ - QThread - 问题(初学者)

c++ - extern "C"在 C++ 中如何工作?

c++ - 如何在 C++ 中实现字典 "with a Python tuple"作为键?

c - 为什么不将任务上下文置于中断中

c++ - 创建 C++ 图形用户界面 : What is the easiest way to do it?

c - 为什么在 pthread 中使用 mutex 时会出现死锁?

c - C 中的 For 循环循环次数超出了应有的次数。为什么?

c++ - 使用无符号字符数组处理单个字节