2014-09-05 44 views
0
0000 => 0000 
0001 => 1111 
0010 => 1110 
0100 => 1100 
1000 => 1000 

另外:當你不知道最左邊的'1'位在哪裏時如何進行位操作?

0101 => 1101 

正如你可以看到我需要填寫與「1'後,最後一個‘1’,但我不知道提前其中最後一個‘1’是。

+0

它會永遠是兩個或零的冪?這是一個特殊情況,有一個捷徑。 – harold 2014-09-05 15:44:20

+0

沒有:(。我編輯過。 – chrisapotek 2014-09-05 15:56:11

+0

好的,太糟糕了,它本來就是'-x',但我也可以用這個。 – harold 2014-09-05 16:42:56

回答

1

也許像

unsigned int data; 
unsigned int copy = data; 
unsigned int shifts = 0; 
while (copy > 0) {copy=copy>>1; ++shifts;}; 
data = data|((1<<shifts)-1); 
+0

保持,不會將位設置爲* right *最左邊的1? – harold 2014-09-05 17:04:27

+0

當然,我在輸入答案的時候必須在腦中左右互換,但現在我們也有解決方案;) – Thomas 2014-09-08 09:17:46

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的左側沒有零,但它總是通過右側移位進入(確保它是邏輯移位而不是算術移位)。

+0

我忘記了這個問題的關鍵。 D'哦 – harold 2014-09-05 17:31:09

相關問題