代码之家  ›  专栏  ›  技术社区  ›  Meiscooldude

检查数字在有符号整数中是否只有一个位的创新方法

  •  29
  • Meiscooldude  · 技术社区  · 14 年前

    我很清楚,我可以简单地做一个带有计数器的循环,一些模除法,和一个位移位。但我很好奇,如果有更好的方法,因为我们只寻找一个位上。

    bool HasOnlyOneBit (int  numb)
    {
       //return true if numb has only one bit (I.E. is equal to 1, 2, 4, 8, 16... Int.MinValue)
    }
    
    6 回复  |  直到 14 年前
        1
  •  44
  •   Bill the Lizard    14 年前
    return x == (x & -x);
    

    这个答案之所以有效,是因为2的补码符号的设计方式。

    首先,举个例子。假设我们有8位有符号整数。

    00010000  =  16
    11110000  = -16
    

    位和将给你 00010000

    如果数字不是2的幂:

      00101010  =  42
    & 11010110  = -42
    ----------
      00000010 !=  42
    

    您的结果仍然只有一个位,但它与原始值不匹配。因此,原始值设置了多个位。

    此技术为0返回true,这可能是需要的,也可能是不需要的。

        2
  •  25
  •   bragboy    7 年前

    (x & x-1) == 0
    

    维基2的威力: here

    64 = 01000000 (x)
    63 = 00111111 (x-1)
    ______________
    &  = 00000000  == 0
    ______________ 
    

    其他位打开时的大小写

    18 = 00010010 (x)
    17 = 00010001 (x-1)
    ______________
    &  = 00010000  != 0
    ______________ 
    
        3
  •  8
  •   Pete Kirkham    14 年前

    我建议你看一下 Bit Twiddling Hacks 翻页并在“下选择最合适的选项” Determining if an integer is a power of 2 “或” Counting bits set ".

        4
  •  2
  •   srikanta    14 年前

    return (x && ((x & x-1) == 0))

        5
  •  1
  •   Nicolas Göddel    9 年前
    return (x && (0x8000000000000000ULL % x));
    

    if (x == 0) {
        return false;
    } else if (0x8000000000000000ULL % x) {
        return false;
    } else {
        return true;
    }
    

    说明:0x80000000000000是64位寄存器的最高“仅1位”值。只有除以另一个“仅1位”值,才不会产生余数。

        6
  •  0
  •   High Performance Mark    14 年前

        7
  •  0
  •   Shyambeer Singh    4 年前

    Python3高效内存解决方案

    return n > 0 and (n & (n-1)) == 0