C 中带 0 的位掩码

Bit mask with 0's in C

我需要在 C 中构建一个方法,它将 return 一个整数,将 3 个整数作为参数。第一个和第二个 int 是开始和结束位的位置。第三个 int 是 0 或 1 来确定掩码的类型。

例如,

getMask(2, 6, 1); 
//Set bits 2 to 6 to 1, set all others to zero

应将位 2 到 6 设置为 1,将所有其他位设置为零。

0 0  0  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0

所以getMask(2, 6, 1)应该return整数124。

getMask(11, 31, 0)(将位11到31设置为0)应该return 2047.

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1

这是我目前拥有的:

#include <stdio.h>

int getM(int start, int end, int choice) {
    if (choice == 1){
       return ~(~0 << (end - start + 1)) << (start);
    }
    else if (choice == 0){
       return ~(~1 << (end - start + 1)) << (start);
    }
    else{
        return 0;
    }
}

当我选择 1 时它有效,但是对于 0 我完全迷失了。

我目前为 getMask(11, 31, 0) 得到 -2048。

我知道我可以使用 ands 和 ors,但我不知道如何按照我这样做的方式使用它们。

@AnttiHaapala 是正确的:choice==0 只是 choice==1 对相同 startend 的按位求反。因此(作为 MCVE):

#include <stdio.h>

int getM(int start, int end, int choice) {
    if (choice == 1){
       return ~(~0 << (end - start + 1)) << (start);
    }
    else if (choice == 0){
       return ~getM(start, end, 1); /* Just use what you have, but ~ it */
    }
    else{
        return 0;
    }
}

int main() {
    printf("2 6 1 %d\n", getM(2,6,1));
    printf("11 31 0 %d\n", getM(11,31,0));
}