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
对相同 start
和 end
的按位求反。因此(作为 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));
}
我需要在 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
对相同 start
和 end
的按位求反。因此(作为 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));
}