【问题标题】:Check if a number is 2^n [duplicate]检查一个数字是否为 2^n [重复]
【发布时间】:2012-08-06 07:41:41
【问题描述】:

可能重复:
How to check if a number is a power of 2

这个问题在一次采访中被问到。

如何检查数字是否为 2^n 格式 {1, 2, 4, 8, 16, 32, ....}

不使用*/+-% 运算符?

你也不能使用循环。

【问题讨论】:

标签: c math logic bit-manipulation


【解决方案1】:

检查二进制表示中是否恰好设置了一位。

【讨论】:

  • 又名“是N & (N-1) 零”如果一个人实际上是为了效率而不是随机的面试问题要求。
  • @你们俩:我知道。我只是指出这样做的有效方式,因此它是评论而不是答案。
  • @Cicada 除非我们假设整数,否则 任何 大于或等于零的数字都是 2 的幂。
  • 有一个 x86 汇编指令计算整数值中设置的位数。
  • 虽然 Amber 的评论对于实数是正确的,但对于计算机上可表示的任何类型都不正确。例如,对于浮点类型,您可以尝试向上或向下舍入以 2 为底的对数,但是当您返回对其取幂时,即使确实出现了正确的结果值,也会引发不精确的异常。因此,即使在浮点数系统的怪异中,它也不是“二的幂”。
【解决方案2】:

使用旧的 n & (n - 1) == 0,以不使用运算符 - 的方式进行转换。

int powerOfTwo(int number)
{
    int numberMinusOne = --number;
    ++number;

    if (number == 0)
        return 0;

    return (number & numberMinusOne) == 0;
}

【讨论】:

  • 避免使用-会带来性能提升吗?
  • @Chethan 我不这么认为。这只是 OP 规定的限制。
猜你喜欢
  • 2017-01-26
  • 2018-10-10
  • 2016-06-27
  • 2011-05-06
  • 1970-01-01
  • 2016-09-12
  • 2020-03-22
  • 2010-10-10
相关资源
最近更新 更多