删除最低位

时间:2009-09-24 14:38:13

标签: java c binary bit-manipulation

给定二进制数,删除最低位的最快方法是什么?

01001001010 - > 01001001000

它将在代码中用于迭代变量的位。伪代码如下。

while(bits != 0){
  index = getIndexOfLowestOrderBit(bits);
  doSomething(index);
  removeLowestOrderBit(bits);
}

我正在考虑使用的语言是C和Java。

7 个答案:

答案 0 :(得分:15)

这是我到目前为止所得到的,我想知道是否有人能够击败它。

bits &= bits-1

答案 1 :(得分:12)

呃......在你的例子中,你已经知道了比特的索引。然后很容易:

bits &= ~(1 << index);

这将屏蔽索引为index的位,而不管其在值中的位置(最高,最低或中间)。想想看,你当然可以使用这样一个事实:你知道这个位已经设置了,并使用XOR再次清除它:

bits ^= (1 << index);

保存反转,这可能是一台机器指令。

如果您想要屏蔽最低设置位,而不知道其索引,那么诀窍是:

bits &= (bits - 1);

例如,请参阅here

答案 2 :(得分:3)

您可以使用x & (~x + 1)找到最低设置位。例如:

    x: 01101100
 ~x+1: 10010100
       --------
       00000100

清除最低设置位然后变为x & ~(x & (~x + 1))

          x: 01101100
~(x&(~x+1)): 11111011
             --------
             01101000

x & (x - 1)也适用,也更容易阅读。

答案 3 :(得分:0)

无用的Bit Twiddling Hacks有一些algorithms for counting zero bits - 这将有助于您实现getIndexOfLowestOrderBit函数。

一旦知道所需位的位置,将其翻转为零非常简单,例如给定一个位置,创建掩码并将其反转,然后将此掩码与原始值进行对比

result = original & ~(1 << pos);

答案 4 :(得分:0)

您不想删除最低位。您希望将最低阶SET位置为零。

一旦你知道索引,你只需做2 ^ index和一个独占或。

答案 5 :(得分:0)

我不知道这是否可以快速比较,但我认为它有效:

int data = 0x44A;
int temp;
int mask;

if(data != 0) {   // if not there is no bit set
   temp = data;
   mask = 1;
   while((temp&1) == 0) {
      mask <<= 1;
      temp >>= 1;
   }
   mask = ~mask;
   data &= mask;
}

答案 6 :(得分:0)

在Java中使用Integer.lowestOneBit()。