我如何写一个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