给定二进制数,删除最低位的最快方法是什么?
01001001010 - > 01001001000
它将在代码中用于迭代变量的位。伪代码如下。
while(bits != 0){
index = getIndexOfLowestOrderBit(bits);
doSomething(index);
removeLowestOrderBit(bits);
}
我正在考虑使用的语言是C和Java。
答案 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()。