我必须检查一个数字是否满足以下条件:

  • 为二进制,所有一位必须是连续的。
  • 该数字必须至少设置一位。
  • ,连续的一位可以在MSB处开始或在LSB处结束,因此,如果该数字由单个一位流后跟零位流组成,则反之亦然。

  • 我写了一段代码,检查这些条件是否存在实际问题(检查数据文件的完整性)。

    它可以正常工作,而且时间紧迫,但是我有点老套,喜欢这样的难题,所以我试图想出一种更聪明的方法来检查一位数据流。

    字符串被零包围的情况很容易,但不能处理特殊情况。

    欢迎提出任何想法,二进制技巧和部分解决方案!

    为了使我的要求更加清楚一些示例:以下数字满足我的条件:
      0x80000000
      0x00000001
      0xff000000
      0x000000ff
      0xffffffff
      0x000ff000
    

    以下数字没有(因为它们有多个连续的一串数字):
      0xf00000f <- one-bit streams should not wrap-around at 2^n
      0x0001700 <- a trivial example.
      0x0000000 <- no one bit at all.
    

    最佳答案

    这应该做您想要的。

    if(i == 0)
        return false;
    while(i % 2 == 0) {
        i = i / 2;
    }
    return (i & (i + 1)) == 0;
    

    关于language-agnostic - 检测整数内的单个一位流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/462609/

    10-11 01:35