如何获取一个数字的最低有效位的值?

30

我正在开发一个编程项目,其中一个任务是编写一个函数,返回标记最低有效位的掩码。你有什么想法可以使用位运算符确定该值吗?

ex: 
0000 0000 0000 0000 0000 0000 0110 0000 = 96
What can I do with the # 96 to turn it into:
0000 0000 0000 0000 0000 0000 0010 0000 = 32

我已经努力思考了数小时,但却无法弄清楚这个问题。非常感谢您的任何帮助!


1
这不是重复的。我忘了提到它必须使用位运算符。 - Riptyde4
1
不是重复的。目标不是获取最低位的索引,而是值。 - R.. GitHub STOP HELPING ICE
抱歉,我的错误。撤回关闭投票。 - Blastfurnace
@R..:从索引中获取值是微不足道的(1 << index)。 - cHao
是的,但通过索引获取值非常低效。你正在执行一个昂贵的操作,然后再反转它,而不是直接解决问题。 - R.. GitHub STOP HELPING ICE
3个回答

60
x &= -x; /* clears all but the lowest bit of x */

3
可以,请问这是什么?我想了解它是如何运作的。使用 x 和 -x 有什么区别?x &= -x 又是什么意思? - Riptyde4
22
对于无符号类型,-x 等价于 TYPE_MAX - x + 1,也等价于 ~x + 1。很容易看出为什么 x &= ~x + 1 起作用。 - Tavian Barnes
1
请看 Tavian 的评论以获取解释。 - R.. GitHub STOP HELPING ICE
3
降低评分 - 这个问题是要找到“位置”,而这个函数只是返回该位的值。 - Brad
@Brad OP 给出了预期输出的示例。 - M.M
针对下降投票:
  1. 回答中的代码结果错误。@TavianBarnes的代码是正确的。
  2. Brad也是正确的。
- Ivy Growing

3
为确保获取正确的位/值:
  • 最低有效位位置上的 = x & 1
  • 隔离的最低有效位的 = x & -x
  • 隔离的最低有效位的从零开始的索引= log2(x & -x)

以下是JavaScript中的示例:

let x = 0b1101000;

console.log(x & 1);            // 0 (the farthest-right bit)
console.log(x & -x);           // 8 (the farthest-right 1 by itself)
console.log(Math.log2(x & -x); // 3 (the zero-based index of the farthest-right 1)

2
更易读的代码:
int leastSignificantBit(int number)
{
    int index = 0;

    while ((~number) & 1) {
        number >>= 1;
        index++;
    }
    return 1 << index;
}

16
文本“更易读的代码”是具有误导性的。这是一种替代方法,它执行了一个昂贵的操作(位搜索,本质上是一种日志类型),然后将其反转以获取答案,而不是直接计算答案。 - R.. GitHub STOP HELPING ICE
2
我明白。但这并不需要对二进制补码有了解,这就是为什么它更“简单”。 但我同意你的观点,它确实更加昂贵。 - MasterID

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接