如何取消设置整数中的特定位

时间:2011-12-19 04:31:32

标签: c# java c++ c

说,我有一个像10101这样的整数,我想取消设置第三位以获得10001;如果我有10001,我仍然会10001;我怎么能实现它?

unset(int i, int j)
int i= 10101 or 10000
int j = 00100

6 个答案:

答案 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)

Bitwise functions

在Java中:

int num = 0b10101;
int mask = 1 << bitPosition;

System.out.println(Integer.toBinaryString(num));
num &= ~mask;
System.out.println(Integer.toBinaryString(num));