【问题标题】:How does this code work to Find the next highest power of 2 for any given number此代码如何工作以查找任何给定数字的 2 的下一个最高幂
【发布时间】:2012-06-18 13:53:20
【问题描述】:

这段代码如何找到任何给定数字 [>1] 的 32 位整数的下一个最高幂?

n--;
n = n | n>>1;
n = n | n>>2;
n = n | n>>4;
n = n | n>>8;
n = n | n>>16;
n++;

【问题讨论】:

  • 是作业/面试题吗?
  • 我会说它没有找到任何给定数字 >1 的 2 的下一个最高幂,因为已经是 2 的幂的输入返回自己而不是 2 的下一个幂。跨度>

标签: c algorithm bit-manipulation


【解决方案1】:

移位和按位或的顺序保证了一个由所有1s 组成的数字,它比2 的幂小一。加 1 得到 2 的幂。

初始递减 1 是为了使其适用于已经是 2 次方的 n 值。

(显然,如果 n 最初是 0,则此代码不起作用。)

【讨论】:

  • @hatchet 它适用于 1,与 2、4 等相同。递减 ~> 0;班次和| ~> 0;递增 ~> 1.
  • @DanielFischer - 但是 1 (2^0) 之后的 2 的幂是 2 (2^1),而不是 1。该算法将从 1 到 0,然后所有右移和或将仍然导致 0,然后 inc 导致 1(这是不正确的)。
  • @hatchet 与 2、4 等相同,也将得出相同的值 (4 ~>[decrement] 3 ~>[shift] 3 ~>[increment] 4)。函数实现中的“次高”表示“不小于参数的 2 的最小幂”。这是模棱两可的,但在对实现的解释中,它适用于所有不会溢出的正 n(对于 int32_t,它的工作最大值为 2^30)。
  • @DanielFischer - 我现在明白你的意思了。尽管对于已经是 2 的幂的输入,这是“次高”的一个令人困惑的定义。当我看到“下一个”这个词时,我会依次想到“后续”或“后续”。
  • @hatchet 我同意。但是我们不知道这个公式是由于代码的作者还是OP,所以我们不知道该怪谁。
【解决方案2】:

递减将使 case 2 ^ n 给出结果 2 ^ n 而不是 2 ^ (n + 1)。与末尾的增量不对应。

递减和递增之间的部分实际上试图填满所有低于当前最高有效位 1 的位。最高位 1 将在每一行之后逐渐传播,并且将填满更少最后一行的有效位。

增量是得到2的下一个最高幂的结果。

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 2023-03-15
    • 2010-11-22
    • 2010-10-10
    • 1970-01-01
    • 2015-11-18
    • 2021-02-24
    相关资源
    最近更新 更多