我需要找出相对于用户提供的数字的掩码值。高位切换为1,休息位切换为0 [示例:10110至10000]
例如。若用户提供输入作为
22(二进制10110)
然后我需要通过改变输入作为1
的高比特找到掩码值和休息到0
。 所以在这种情况下,它应该是:
16(二进制10000)
是否有c
语言中的任何内置的方法来做到这一点。
我需要找出相对于用户提供的数字的掩码值。高位切换为1,休息位切换为0 [示例:10110至10000]
例如。若用户提供输入作为
22(二进制10110)
然后我需要通过改变输入作为1
的高比特找到掩码值和休息到0
。 所以在这种情况下,它应该是:
16(二进制10000)
是否有c
语言中的任何内置的方法来做到这一点。
你可以计算的最高位的位置
一旦你拥有它,只是左移得到适当的屏蔽值:
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;
}
这台result
到16
(有如果输入值为0
)
Thx为您的答案。完美的作品。 – user5708039
基本上,您需要将楼层对齐到两个数字的最近的幂。我不确定是否有标准功能,但请尝试以下操作:
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);
}
如果输入的最高位已设置,则这不起作用,例如, 'floor_align32pow2(0x80000000)'将返回0而不是0x80000000。你可以用'return(x >> 1)+(x & 1);'。 –
@IanAbbott)来解决它,你是对的,谢谢 –
您是否在寻找二进制和? ('22&16 == 16') – cubrr
所以你想保持最高位为1并将所有其他位设为零?例如:1010 - > 1000,10100111 - > 100000000,111 - > 100等。没有这种内置功能,但您可以自己轻松编写一个(估计4-5行)。 –
@cubrr如果我已经有价值16,那么在这里做什么用。例如,如果输入是86,那么我需要计算它的第二个操作数,这是我的目标。 – user5708039