2012-09-14 51 views
3

可能重複:
Find the highest order bit in C如何找到最左邊的1 32位INT用C

我如何寫一個C函數,將產生的掩碼錶明在最左邊的1x

例如:0xFF00 -> 0x80000x6600 -> 0x4000。到目前爲止:

int left1(unsigned x){} 

我明白了,0xFF00 == 1111 1111 0000 0000..0x6600 == 0110 0110 0000 0000..但我以後難住了。

+1

使用位移位>>和掩蔽及 – TJD

+0

如果你將它轉換爲有符號,你能不能做(x <0)? – ratbum

+0

@TJD掩蔽是什麼意思? – sebi

回答

3

計算向右移位直到達到1所需的次數,然後向左移位該相同的計數。

int ct=0; 
while (x > 1) { ct++; x = x >> 1; } 
x = x << ct; 
0

一種方法是創建一個位掩碼,然後右移該值。

也就是說,創建一個掩碼,使你的整數是「1000 ......」或「0 .....」 - 取決於第一個位是0或1。

然後取整數並右移它直到它變成最不重要的位,而不是最重要的位。作爲一個例子,0b10000000 >> 8是1.

所以首先,根據你的整數的大小,你必須移位,好吧,但是很多位是相關的。

然後你必須創建位掩碼。讓我們只需要1個字節的整數:

unsigned int i = 1 << 8將創建一個整數i,其最顯著位是1

或者你可以使用十六進制。你已經知道0xFF == 11111111。你可以進一步分解它:0xF0 == 11110000

由於0xF == 1111在二進制,那麼我們會做相反的事情。二進制中的1000是什麼,在十六進制? 1000二進制是數字8,這也恰好等於0x8

因此,對於單個字節,對於最左邊的位掩碼爲0x80

Now!將其應用於32位!

祝你好運!

13

可以分爲兩個部分做到這一點:首先,使用一個名爲「位拖尾」技術,以確保所有的位到第1的右側也是1:

x |= x >> 16; 
x |= x >> 8; 
x |= x >> 4; 
x |= x >> 2; 
x |= x >> 1; 

在這一點上,輸入0xFF00將使x等於0xFFFF,並且輸入0x6600將使x等於0x7FFF。然後,我們可以使用只留下1集最高:

x ^= x >> 1; 
+0

第一部分不應該是相反的順序嗎? – alveko

+0

@alveko:它的工作方式也一樣。 – caf

+0

這不適用於負數,因爲符號位是粘性的。 –