0000 => 0000
0001 => 1111
0010 => 1110
0100 => 1100
1000 => 1000
0101 => 1101
正如你可以看到我需要填寫與「1'後,最後一個‘1’,但我不知道提前其中最後一個‘1’是。
0000 => 0000
0001 => 1111
0010 => 1110
0100 => 1100
1000 => 1000
0101 => 1101
正如你可以看到我需要填寫與「1'後,最後一個‘1’,但我不知道提前其中最後一個‘1’是。
而是直接使有位的面具被接通,它更容易讓位的面具,應該是不變的(不是真的,但它更容易解釋這個樣子):最左邊的1複製到所有位,它的右邊:
m = x | (x >> 1);
m |= m >> 2;
m |= m >> 4;
m |= m >> 8;
m |= m >> 16; // 5 steps for 32 bits, in general log2(width) steps
例如,0101 => 0111
,或1000 -> 1111
。
很明顯的是,補充是應該的(除非x
是零)被關位的面具,所以現在:
if (x != 0) // this line makes me sad :(
x |= ~m;
避免了長環,但仍然有一部分是ISN嚴格控制位操作。
不太清楚,使用的伎倆,從我的意見,注意觀察,如果m
只有它的最左邊的1套,它的否定將是在x
要設置的位(以及已經在x
設置了一下,但沒關係)。所以,你得到:
m &= ~(m >> 1); // see below
x |= -m;
的m &= ~(m >> 1)
竅門只需1的最左邊m
,現在這是可能的,因爲m
是二減1的功率,所以只有1,可以有一個0到它的左邊是最左邊的1.在x = 0
,m = 0
的情況下,因此顯然是m & something = 0
- 無需特殊情況。在x
設置了最高位並且因此m = -1
的情況下,雖然最左側1的左側沒有零,但它總是通過右側移位進入(確保它是邏輯移位而不是算術移位)。
我忘記了這個問題的關鍵。 D'哦 – harold 2014-09-05 17:31:09
它會永遠是兩個或零的冪?這是一個特殊情況,有一個捷徑。 – harold 2014-09-05 15:44:20
沒有:(。我編輯過。 – chrisapotek 2014-09-05 15:56:11
好的,太糟糕了,它本來就是'-x',但我也可以用這個。 – harold 2014-09-05 16:42:56