2017-08-30 45 views
2

我需要找出相对于用户提供的数字的掩码值。高位切换为1,休息位切换为0 [示例:10110至10000]

例如。若用户提供输入作为

22(二进制10110)

然后我需要通过改变输入作为1的高比特找到掩码值和休息到0。 所以在这种情况下,它应该是:

16(二进制10000)

是否有c语言中的任何内置的方法来做到这一点。

+0

您是否在寻找二进制和? ('22&16 == 16') – cubrr

+0

所以你想保持最高位为1并将所有其他位设为零?例如:1010 - > 1000,10100111 - > 100000000,111 - > 100等。没有这种内置功能,但您可以自己轻松编写一个(估计4-5行)。 –

+0

@cubrr如果我已经有价值16,那么在这里做什么用。例如,如果输入是86,那么我需要计算它的第二个操作数,这是我的目标。 – user5708039

回答

1

你可以计算的最高位的位置

一旦你拥有它,只是左移得到适当的屏蔽值:

unsigned int x = 22; 
    int result = 0; 

    if (x != 0) 
    { 
    unsigned int y = x; 
    int bit_pos=-1; 
    while (y != 0) 
    { 
     y >>= 1; 
     bit_pos++; 
    } 
    result = 1<<bit_pos; 
    } 

这台result16

(有如果输入值为0

+0

Thx为您的答案。完美的作品。 – user5708039

0

基本上,您需要将楼层对齐到两个数字的最近的幂。我不确定是否有标准功能,但请尝试以下操作:

static inline uint32_t 
floor_align32pow2(uint32_t x) 
{ 
     x |= x >> 1; 
     x |= x >> 2; 
     x |= x >> 4; 
     x |= x >> 8; 
     x |= x >> 16; 

     return (x >> 1) + (x & 1); 
} 
+1

如果输入的最高位已设置,则这不起作用,例如, 'floor_align32pow2(0x80000000)'将返回0而不是0x80000000。你可以用'return(x >> 1)+(x & 1);'。 –

+0

@IanAbbott)来解决它,你是对的,谢谢 –