【问题标题】:Power of 2 formula help2公式帮助的力量
【发布时间】:2011-07-02 05:23:29
【问题描述】:

我知道 Java 中的 (2 * i == (i ^( i - 1) + 1) 可以让我找到一个数字是否是 2 的幂。但是有人能解释一下为什么会这样吗?

【问题讨论】:

  • 我相信你需要一个额外的括号(i ^ (i-1)) + 1
  • 你不需要它们,因为 - 在 java 中比 ^ 具有更高的优先级,但它有助于理解。
  • 这不是编程问题,实际上与Java无关。

标签: java math binary


【解决方案1】:

2*i == (i ^ (i-1)) + 1

基本上,如果 i 是 2 的幂,则它的位模式中将有一个 1。如果从中减去 1,则该1 位的所有低位变为1,并且该二的幂位将变为0。然后您对这些位执行XOR,这将产生一个全1位模式。再加上 1,得到 2 的下一个幂。

记住异或真值表:

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

例子:

假设i 是 256,也就是这个位模式。

100000000 = 2^8 = 256

100000000 - 1 = 011111111 = 2^7 + 2^6 + ... + 2^0 = 255

100000000 ^ 011111111 = 111111111 = = 2^8 + 2^7 + ... + 2^0 = 511

111111111 + 1 = 1000000000 = 2^9 = 512 = 2*i

这是一个示例,当您没有看到 2 的幂时

i = 100 = 2^6 + 2^5 + 2^2

0110 0100

0110 0100 - 1 = 99 = 2^6 + 2^5 + 2^1 + 2^0 = 0110 0011

0110 0100 ^ 0110 0011 = 0000 0111 = 2^2 + 2^1 + 2^0 = 7

0000 0111 + 1 = 000 1000 = 2^3 = 8 != (2*i)

简化版

此外,此检查还有一个修改版本,用于确定某个无符号正整数是否为 2 的幂。

(i & (i-1)) == 0

基本原理相同

如果 i 是 2 的幂,则它的位表示中只有一个 1 位。如果从中减去 1,则1 位变为 0,所有低位变为1。然后AND 将产生一个全0 位模式。

【讨论】:

  • 您应该为不是 2 的幂的数字添加一些示例,因为这两条规则不起作用。
【解决方案2】:

重要的是 i^(i-1) (我假设这是问题中的一个小错字)。假设 i 是 2 的幂。那么它的二进制展开是 1 后跟许多零。 i-1 是一个数字,其中前导 1 被零替换,所有零都被替换为 1。所以 XOR 的结果是一串 1,与 i 的位数相同。

另一方面,如果 i 不是 2 的幂,则从中减去 1 不会翻转所有这些位 - 当您减去时,xor 会识别哪些位没有从一个位置传送到下一个位置1. 异或的结果会是0,所以加1的时候不会进位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2021-06-06
    • 2011-05-18
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多