说,我有一个像10101
这样的整数,我想取消设置第三位以获得10001
;如果我有10001
,我仍然会10001
;我怎么能实现它?
unset(int i, int j)
int i= 10101 or 10000
int j = 00100
答案 0 :(得分:42)
假设您正在从右侧索引位,这应该可以取消设置value
中的特定位:
int mask = 1 << bitIndex;
value &= ~mask;
您可以使用类似的代码设置该位:
value |= mask;
其中mask
和以前一样。 (这假设位索引从0开始。)
答案 1 :(得分:10)
清除或取消设置
使用按位AND运算符(&amp;)清除一位。
number &= ~(1 << x);
这将清除位x。必须使用按位NOT运算符(〜)反转位串,然后运行AND。
注意:这里x是从0到LSB的位的位置。
答案 2 :(得分:2)
您可以切换第n位
result = number ^(1&lt;&lt; bitIndex)
答案 3 :(得分:1)
如果您正在处理litterals,那么您可以使用十六进制数字。将位模式转换为十六进制数:
10101 => 0x15
00100 => 0x04
因此,以下C代码会将b
设置为您想要的结果。
int a = 0x15;
int b = a & ~( 0x04 );
如果你想要通用的东西,你可以有一个C函数(删除所有范围检查),如
int clearBit( int value, int bit )
{
// Assume we count bits starting at 1
return value & ~( 1 << (bit -1) );
}
答案 4 :(得分:0)
在C和C ++中使用 bit wise AND operator 形成AND掩码:
10101 & 10001
答案 5 :(得分:0)
在Java中:
int num = 0b10101;
int mask = 1 << bitPosition;
System.out.println(Integer.toBinaryString(num));
num &= ~mask;
System.out.println(Integer.toBinaryString(num));