最近我遇到了這個問題,要求您返回二進制字符串中的連續數字,從左到右(如此11101001 = 3
,011111 = 0
,111101 = 4
等)。問題在於只使用二元操作數來完成,而沒有任何循環。瞭解使用二進制操作數來計算二進制數中1的個數的函數
在網上看了一下(感謝谷歌)後,我發現有人想出了這個解決方案,並希望更好地幫助理解它。
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位,然後進入下一個8取決於他們是否是全1,那麼接下來的4取決於這些是否是全1 ,然後是2,然後是1等。
不幸的是,我很遺憾代碼是如何完成這個操作的,並且希望能幫助理解。
例如,在這裏:
r = !(~(v>>16)) << 4;
v <<= r;
我可以看到v
被移出和否定,而是很茫然,如何這有助於解決任何問題。
它檢查是否所有的前16位都是1。如果爲真,則刪除所有前16位,並將下16位移到上,以0填滿。 – user3528438