2012-09-14 22 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

这不适用于负数,因为符号位是粘性的。 –