其他分享
首页 > 其他分享> > c – 如何设置,清除和切换一个位?

c – 如何设置,清除和切换一个位?

作者:互联网

如何设置,清除和切换C/C++?

解决方法:

设置一下

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

number |= 1UL << n;

这将设置第n位数. n应该为零,如果要设置第1位,依此类推至n-1,如果要设置第n位.

如果数字宽于无符号长,则使用1ULL;促进1UL<< n在评估1UL<<< n,它的未定义行为要超过长度的宽度.这同样适用于所有其他示例. 清理一下 使用按位AND运算符(&)清除一下.

number &= ~(1UL << n);

这将清除数字的第n位.必须使用按位NOT运算符(〜)反转位串,然后运行AND.

切换了一下

XOR运算符(^)可用于切换位.

number ^= 1UL << n;

这将切换数字的第n位.

检查一下

你没有要求这个,但我不妨补充一下.

要检查一下,将数字n向右移动,然后按位向右移动:

bit = (number >> n) & 1U;

这将把数字的第n位的值放入变量位.

将第n位更改为x

将第n位设置为1或0可以通过以下2的补码C实现来实现:

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

如果x为1,则将设置位n,如果x为0,则清除位.如果x具有其他值,则会产生垃圾. x = !! x将其布尔化为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位,并且(x << n)将第n位设置为x. 一般来说,通常不要复制/粘贴代码也是一个好主意,因此很多人使用预处理器宏(如the community wiki answer further down)或某种封装.

标签:c-3,c,bitwise-operators,bit-manipulation
来源: https://codeday.me/bug/20190910/1802227.html