如何设置、清除和切换一点
设置一点
使用按位OR运算符(|
)设置位
编号|=1UL<&书信电报;N
这将设置编号的第位<如果要设置n
第位,则code>n应为零,如果要将1
st位等设置为n-1
如果number
的宽度大于无符号long
,则使用1all
;推广1UL<&书信电报;n
在评估1UL<&书信电报;n
移动超过长的宽度是未定义的行为
。这同样适用于所有其他示例
清理一下
使用按位AND运算符(&;
)清除位
编号&;=~(1UL<;<;n);
这将清除编号的第位。必须使用按位NOT运算符(~
)反转位字符串,然后将其反转
切换一点
异或运算符(^
)可用于切换位
number^=1UL<&书信电报;N
这将切换编号的第位
检查一下
你没有要求这个,但我还是补充一下
要检查位,请将数字n向右移动,然后按位将其删除:
位=(数字>;>;n)&;1U;
这将把n
number的第位的值放入变量bit
将nth位更改为x
将2版的补码C++实现为< n>代码>第1位> > 或 0 >代码>:
number^=(-x^ number)&;(1UL<;<;n);
如果x
为1
,则设置位n
,如果x
为0
,则清除位。如果
将其布尔化为0或1x
有其他值,则会得到垃圾x=!!x
使它独立于2的补码否定行为(其中 -1 所有位都设置,与1的补码或符号/大小C++实现不同),使用无符号否定。
number^=((无符号长)x^编号)&;(1UL<;<;n);
或
无符号长纽比特=!!x、 //也可以布尔化为强制0或1
编号^=(-newbit^编号)&;(1UL<;<;n);
通常,使用无符号类型进行可移植位操作是一个好主意
或
number=(number&;~(1UL<;<;n))|(x<;<;n);
(number&;~(1UL<;<;n))
将清除n
第位,而(x<;<;n)
将n
第位设置为x
一般来说,最好不要复制/粘贴代码,因为很多人都使用预处理器宏(比如下面的社区wiki答案)或某种封装