【问题标题】:To clear bits from i through 0 - bit manipulation通过 0 位操作清除 i 中的位
【发布时间】:2018-02-26 02:56:27
【问题描述】:

我要去破解编码面试第 5 章位操作 并找到了清除数字 num 中从 i 到 0 的位的方法

int mask = ~(-1 >>> (31 - i));
return num & mask

虽然上述方法有效

我们能不能简单点

int mask = (-1 << (i+1));
return num & mask;

我错过了任何极端情况吗?

【问题讨论】:

    标签: java bit-manipulation bit


    【解决方案1】:

    当然。你的掩码-1 &lt;&lt; (i+1)在逻辑上等同于本书的掩码~(-1 &gt;&gt;&gt; (31 - i))

    您的方法将-1 向左移动i + 1 次,用0 填充最低的i + 1 位。

    本书的方法在逻辑上将-1 向右移动31 - i 次,用0 填充最高的31 - i 位。但是,它随后会反转位,这就是使您的位与之等效的原因。要验证 int 的所有值,您可以创建一个简单的 for 循环:

    for (int i = 0; i < 31; i++) {
        System.out.println(~(-1 >>> (31 - i)) + " " + (-1 << (i+1)));
    }
    

    运行它时,您会发现两个掩码在每次迭代时都是等效的。

    【讨论】:

      【解决方案2】:

      确实有一个极端情况:对于i = 31(-1 &lt;&lt; (i+1)) = -1~(-1 &gt;&gt;&gt; (31 - i)) = 0

      发生这种情况是因为移位计数取模于类型的大小(以位为单位),在本例中为 32,(31 + 1) mod 32 = 0,因此在两个表达式中,有效移位计数为零。然后,由于第二个表达式的反转逻辑,它们的行为不同。

      但是,~(-1 &gt;&gt;&gt; (31 - i)) 等价于更简单的-2 &lt;&lt; i

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多