设置一点
使用按位或运算符 (|
) 设置位。
number |= 1UL << n;
这将设置 n
number
的第. n
如果要设置 1
,则应为零。 st 位等直到 n-1
, 如果要设置 n
第一点。
使用 1ULL
如果 number
比 unsigned long
更宽;推广1UL << n
直到评估 1UL << n
之后才会发生如果移动超过 long
的宽度是未定义的行为.这同样适用于所有其他示例。
清理一下
使用按位与运算符 (&
) 清除位。
number &= ~(1UL << n);
这将清除 n
number
的第.您必须使用按位 NOT 运算符 ( ~
) 反转位字符串,然后进行 AND。
稍微切换
XOR 运算符 (^
) 可用于切换位。
number ^= 1UL << n;
这将切换 n
number
的第.
检查一下
这不是你要求的,但我不妨添加它。
要检查一下,将数字 n 向右移动,然后按位与它:
bit = (number >> n) & 1U;
这将把 n
的值number
的第进入变量 bit
.
将第 n 位更改为 x
设置n
位到 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
第 x
位.
通常不要复制/粘贴代码也是一个好主意,因此很多人使用预处理器宏(如 the community wiki answer further down )或某种封装。
我是一名优秀的程序员,十分优秀!