在 unsigned int 中设置从 k 位置开始的 n 位掩码
Set n bits mask starting with k position in unsigned int
假设我想将掩码 11d 应用于从位置 k 开始的无符号整数(在那个无符号整数中)。如何实施?
我写了一个实现这个的函数,也许对某人有用
#include <stdio.h>
#include <limits.h>
#define BITS_PER_INT (CHAR_BIT * sizeof(unsigned int))
unsigned int set_bitmask_from_k_position(unsigned int x, int k, unsigned int pattern)
{
int nbits;
unsigned int tmp;
for (nbits = 0, tmp = pattern; tmp > 0; tmp /= 2, nbits++);
unsigned int mask = 0;
mask|=mask | ((~0u << (k+nbits-1))|(~0u >> (BITS_PER_INT-k+1)));
x &= mask;
mask = pattern << (k - 1);
x |= mask;
return x;
}
int main(void)
{
printf("0x%X\n", set_bitmask_from_k_position(0x12345678u, 12, 11));
}
我自己回答了我自己的问题,感谢所有帮助我的问题的人,甚至是那些降级我问题的人,我在stackowerflow上没有找到这样的问题,所以我问了
通过生成值215−12+1−1:
为12到15(含)的位数做一个位掩码
unsigned mask = (1u << (15-12+1)) - 1u;
将掩码移动到位 12 到 15:
mask <<= 12;
使用掩码关闭 x
中的位 12 到 15:
x &= ~mask;
在这些位中输入 11:
x |= 11 << 12;
一步完成:
x = x & ~( ((1u << (15-12+1)) - 1u) << 12 ) | (11 < 12);
我也可以这样写:
x = x & ~( (2u<<15) - (1u<<12) ) | (11 < 12);
因为 2u<<15
将 +1
组合到移位中,如果我们想使用达到 unsigned
中最高位的字段,则可以避免 C 语义的问题。
假设我想将掩码 11d 应用于从位置 k 开始的无符号整数(在那个无符号整数中)。如何实施?
我写了一个实现这个的函数,也许对某人有用
#include <stdio.h>
#include <limits.h>
#define BITS_PER_INT (CHAR_BIT * sizeof(unsigned int))
unsigned int set_bitmask_from_k_position(unsigned int x, int k, unsigned int pattern)
{
int nbits;
unsigned int tmp;
for (nbits = 0, tmp = pattern; tmp > 0; tmp /= 2, nbits++);
unsigned int mask = 0;
mask|=mask | ((~0u << (k+nbits-1))|(~0u >> (BITS_PER_INT-k+1)));
x &= mask;
mask = pattern << (k - 1);
x |= mask;
return x;
}
int main(void)
{
printf("0x%X\n", set_bitmask_from_k_position(0x12345678u, 12, 11));
}
我自己回答了我自己的问题,感谢所有帮助我的问题的人,甚至是那些降级我问题的人,我在stackowerflow上没有找到这样的问题,所以我问了
通过生成值215−12+1−1:
为12到15(含)的位数做一个位掩码unsigned mask = (1u << (15-12+1)) - 1u;
将掩码移动到位 12 到 15:
mask <<= 12;
使用掩码关闭 x
中的位 12 到 15:
x &= ~mask;
在这些位中输入 11:
x |= 11 << 12;
一步完成:
x = x & ~( ((1u << (15-12+1)) - 1u) << 12 ) | (11 < 12);
我也可以这样写:
x = x & ~( (2u<<15) - (1u<<12) ) | (11 < 12);
因为 2u<<15
将 +1
组合到移位中,如果我们想使用达到 unsigned
中最高位的字段,则可以避免 C 语义的问题。