我如何寫一個C函數,將產生的掩碼錶明在最左邊的1
x
。
例如:0xFF00 -> 0x8000
和0x6600 -> 0x4000
。到目前爲止:
int left1(unsigned x){}
我明白了,0xFF00 == 1111 1111 0000 0000..
和0x6600 == 0110 0110 0000 0000..
但我以後難住了。
我如何寫一個C函數,將產生的掩碼錶明在最左邊的1
x
。
例如:0xFF00 -> 0x8000
和0x6600 -> 0x4000
。到目前爲止:
int left1(unsigned x){}
我明白了,0xFF00 == 1111 1111 0000 0000..
和0x6600 == 0110 0110 0000 0000..
但我以後難住了。
計算向右移位直到達到1所需的次數,然後向左移位該相同的計數。
int ct=0;
while (x > 1) { ct++; x = x >> 1; }
x = x << ct;
一種方法是創建一個位掩碼,然後右移該值。
也就是說,創建一個掩碼,使你的整數是「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位!
祝你好運!
使用位移位>>和掩蔽及 – TJD
如果你將它轉換爲有符號,你能不能做(x <0)? – ratbum
@TJD掩蔽是什麼意思? – sebi