将高位切换为 1 并将其余位切换为 0 [示例:10110 到 10000]
Toggle high bit to 1 and rest bits to 0 [example: 10110 to 10000]
我需要根据用户提供的数字找出掩码值。
例如。如果用户提供输入
22 (in binary 10110)
然后我需要通过将输入的高位更改为 1
并将其余位更改为 0
来找到掩码值。
所以在这种情况下应该是:
16 (in binary 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
则有特殊情况)
基本上,您需要向下对齐到最接近的两个数的幂。我不确定是否有标准功能,但请尝试以下操作:
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);
}
我需要根据用户提供的数字找出掩码值。
例如。如果用户提供输入
22 (in binary 10110)
然后我需要通过将输入的高位更改为 1
并将其余位更改为 0
来找到掩码值。
所以在这种情况下应该是:
16 (in binary 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
则有特殊情况)
基本上,您需要向下对齐到最接近的两个数的幂。我不确定是否有标准功能,但请尝试以下操作:
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);
}