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

如何设置、清除和切换一点

设置一点

使用按位OR运算符(|)设置位

编号|=1UL&lt&书信电报;N

这将设置编号的第位<如果要设置n第位,则code>n应为零,如果要将1st位等设置为n-1

如果number的宽度大于无符号long,则使用1all;推广1UL&lt&书信电报;n在评估1UL&lt&书信电报;n移动超过长的宽度是未定义的行为。这同样适用于所有其他示例

清理一下

使用按位AND运算符(&amp;)清除位

编号&amp;=~(1UL&lt;&lt;n);

这将清除编号的第位。必须使用按位NOT运算符(~)反转位字符串,然后将其反转

切换一点

异或运算符(^)可用于切换位

number^=1UL&lt&书信电报;N

这将切换编号的第位

检查一下

你没有要求这个,但我还是补充一下

要检查位,请将数字n向右移动,然后按位将其删除:

位=(数字&gt;&gt;n)&amp;1U;

这将把nnumber的第位的值放入变量bit

nth位更改为x

将2版的补码C++实现为< n>代码>第1位> > 或 0 >代码>:

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

如果x1,则设置位n,如果x0,则清除位。如果x有其他值,则会得到垃圾x=!!x将其布尔化为0或1

使它独立于2的补码否定行为(其中 -1 所有位都设置,与1的补码或符号/大小C++实现不同),使用无符号否定。

number^=((无符号长)x^编号)&amp;(1UL&lt;&lt;n);

无符号长纽比特=!!x、 //也可以布尔化为强制0或1
编号^=(-newbit^编号)&amp;(1UL&lt;&lt;n);

通常,使用无符号类型进行可移植位操作是一个好主意

number=(number&amp;~(1UL&lt;&lt;n))|(x&lt;&lt;n);

(number&amp;~(1UL&lt;&lt;n))将清除n第位,而(x&lt;&lt;n)n第位设置为x

一般来说,最好不要复制/粘贴代码,因为很多人都使用预处理器宏(比如下面的社区wiki答案)或某种封装

发表评论