C 中的位掩码范围
Masking range of bits in C
我正在尝试用 C 编写一个接受三个整数的方法:开始、结束和掩码。如果mask为1,则除start to end范围内的所有位都设置为0,范围内的位设置为1。我现在有这部分工作:
for (int i = 0; i < (end - start + 1); i++)
{
if (mask == 1)
{
ret |= ret << 1;
ret |= ret | 1;
}
}...ret = ret << start;
(其中 'ret' 是一个无符号整数,如果掩码为 1,则简单地从 0 开始,如果掩码为 0,则从 ~0 开始)。但是,我似乎无法弄清楚如何以另一种方式做到这一点:将一系列位屏蔽为 0 并将所有其余位设置为 1。
由于将掩码从 1 翻转为 0 只会反转结果,您可以忽略掩码,为 mask == 1
构建 return,如果掩码为零,则在末尾翻转其位:
int ret = 0;
for (int i = start ; i <= end ; i++) {
ret |= 1 << i;
}
if (!mask) {
ret = ~ret;
}
我正在尝试用 C 编写一个接受三个整数的方法:开始、结束和掩码。如果mask为1,则除start to end范围内的所有位都设置为0,范围内的位设置为1。我现在有这部分工作:
for (int i = 0; i < (end - start + 1); i++)
{
if (mask == 1)
{
ret |= ret << 1;
ret |= ret | 1;
}
}...ret = ret << start;
(其中 'ret' 是一个无符号整数,如果掩码为 1,则简单地从 0 开始,如果掩码为 0,则从 ~0 开始)。但是,我似乎无法弄清楚如何以另一种方式做到这一点:将一系列位屏蔽为 0 并将所有其余位设置为 1。
由于将掩码从 1 翻转为 0 只会反转结果,您可以忽略掩码,为 mask == 1
构建 return,如果掩码为零,则在末尾翻转其位:
int ret = 0;
for (int i = start ; i <= end ; i++) {
ret |= 1 << i;
}
if (!mask) {
ret = ~ret;
}