最近我遇到了这个问题,它要求您返回二进制字符串中连续数字的数量,从左到右(so 11101001 = 3
, 011111 = 0
, 111101 = 4
, 等)。关键是只使用二进制操作数,并且没有任何类型的循环。
在网上浏览了一下(感谢谷歌)后,我发现了其他人提出的这个解决方案,并希望更好地帮助理解它。
int leftBitCount(int x) {
int v = x;
int r; // store our result here
int shift;
int full = !(~x); // we must add one if we have 0xffffffff
// Check the top 16 bits and add them to our result if they exist
r = !(~(v>>16)) << 4;
v <<= r;
// check the remaining 8 bits
shift = !(~(v >> 24)) << 3;
v <<= shift;
r |= shift;
// remaining 4 bits
shift = !(~(v>>28)) << 2;
v <<= shift;
r |= shift;
// remaining 2 bits
shift = !(~(v >> 30)) << 1;
v <<= shift;
r |= shift;
// remaining 1 bits
r ^= 1&((v>>31));
// remember to add one if we have 32 on bits
return r + full;
}
据我所知,该函数显然检查了 32 位整数的前 16 位,然后根据它们是否全为 1 进入下一个 8 位,然后根据是否全为 1 进入下一个 4 位,然后是 2,然后是 1,等等
不幸的是,我对代码究竟是如何实现这一点有点迷茫,并希望得到一些帮助理解。
例如,这里:
r = !(~(v>>16)) << 4;
v <<= r;
我可以看到它v
正在被转移和否定,但我不知道这如何帮助解决任何问题。