我必须检查一个号码是否满足以下条件:
- 在二进制中,所有一位必须是连续的。
- 该数字必须至少设置一位。
- 连续的一位可能从 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)