【问题标题】:How bit manipulation works?位操作如何工作?
【发布时间】:2017-04-20 05:16:37
【问题描述】:

有人问了一个问题:

"用整数n表示,求第二个从0开始的位置 二进制表示中最右边的零位(保证 有这么一点),从右往左数。

返回 2position_of_the_found_bit 的值。”

我写了下面的解决方案,效果很好。

int secondRightmostZeroBit(int n) {
  return (int)Math.pow(2,Integer.toBinaryString(n).length()-1-Integer.toBinaryString(n).lastIndexOf('0',Integer.toBinaryString(n).lastIndexOf('0')-1))  ;
}

但下面是我也喜欢的最佳投票解决方案,因为它只有几个字符编码和服务于目的,但我无法理解。有人可以解释一下位操作如何帮助实现它。

int secondRightmostZeroBit(int n) {
  return ~(n|(n+1)) & ((n|(n+1))+1) ;
}

【问题讨论】:

    标签: java bit-manipulation


    【解决方案1】:

    假设某个数字至少有两个 0 位。这是一个这样的数字的示例,其中标记了最右边的 2 个 0 位(x...x 是我们不关心的位,可以是 0 或 1,而 1...1 是零或更多的序列最右边的0位的右边和左边的1位):

    x...x01...101...1 - that's n
    

    如果你在那个数字上加 1,你会得到:

    x...x01...110...0 - that's (n+1)
    

    表示最右边的 0 位翻转为 1

    因此n|(n+1) 会给你:

    x...x01...111...1 - that's n|(n+1)
    

    如果您将1 添加到n|(n+1),您会得到:

    x...x100........0 - that's (n|(n+1))+1
    

    这意味着第二个最右边的 0 位也翻转为 1

    现在,~(n|(n+1))

    y...y10.........0 - that's ~(n|(n+1))
    

    其中每个 y 位是相应 x 位的倒数

    因此~(n|(n+1)) & ((n|(n+1))+1) 给了

    0...010.........0
    

    其中唯一的 1 位位于输入数字的第二个最右边 0 位的位置。

    【讨论】:

    • 我理解并找出了第二个设置位.. (~(~n|~n+1) & ((~n|~n+1)+1))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2013-03-04
    • 1970-01-01
    • 2010-10-06
    • 2014-07-15
    • 1970-01-01
    相关资源
    最近更新 更多