你如何设置,清除和切换一个位?
你如何在C / C ++中设置,清除和切换一点?
设置一下
使用位运算符( |
)设置一个位。
number |= 1UL << x;
这将设置位x
。
如果number
宽于unsigned long
则使用1ULL
; 在评估1UL << x
之后, 1UL << x
推广1UL << x
发生,其中它的未定义行为的移动幅度超过了一个long
的宽度。 这同样适用于所有其他例子。
清理一下
使用按位AND运算符( &
)清除一点。
number &= ~(1UL << x);
这将清除位x
。 您必须用位运算符NOT( ~
)反转位串,然后进行与运算。
切换一下
XOR运算符( ^
)可用于切换一个位。
number ^= 1UL << x;
这将切换位x
。
检查一下
你没有要求这个,但我不妨补充一下。
要检查一下,把数字x移到右边,然后逐位AND:
bit = (number >> x) & 1U;
这会将位x
的值放入可变bit
。
将第n位更改为x
将第n
位设置为1
或0
可以在2的补码C ++实现中通过以下方式实现:
number ^= (-x ^ number) & (1UL << n);
如果x
是1
,位n
将被设置,并且如果x
是0
,则位n
被清除。 如果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);
使用无符号类型进行便携式位操作通常是一个好主意。
一般来说,不要复制/粘贴代码通常是一个好主意,许多人使用预处理器宏(比如社区维基答案)或某种封装。
使用标准C ++库: std::bitset<N>
。
或Boost版本: boost::dynamic_bitset
。
没有必要推出自己的:
#include <bitset>
#include <iostream>
int main()
{
std::bitset<5> x;
x[1] = 1;
x[2] = 0;
// Note x[0-4] valid
std::cout << x << std::endl;
}
[Alpha:] > ./a.out
00010
与标准库编译时大小的位集相比,Boost版本允许运行时大小的位集。
另一种选择是使用位域:
struct bits {
unsigned int a:1;
unsigned int b:1;
unsigned int c:1;
};
struct bits mybits;
定义了一个3位字段(实际上,它是三个1位字节)。 位操作现在变得有点简单了(哈哈):
设置或清除一点:
mybits.b = 1;
mybits.c = 0;
切换一下:
mybits.a = !mybits.a;
mybits.b = ~mybits.b;
mybits.c ^= 1; /* all work */
检查一下:
if (mybits.c) //if mybits.c is non zero the next line below will execute
这只适用于固定大小的位域。 否则,你必须诉诸前几篇文章中描述的那些颠覆性技巧。
链接地址: http://www.djcxy.com/p/751.html上一篇: How do you set, clear, and toggle a single bit?
下一篇: c++