弄清楚是否设置了无符号短路中的位

时间:2014-02-07 04:45:54

标签: c bits

好好弄清楚是否设置了无符号短路中的位。所以如果x中的位i置位则返回1,否则返回0。另外我要记住,这些位从右边开始编号为0:如b15b14b13 ... b3b2b1b0。好吧,我试过这样,但我认为它不起作用......任何帮助都会赞赏。

short is_set(unsigned short x, int bit) {
return (x >> bit) & 1;

}

3 个答案:

答案 0 :(得分:1)

short is_set(unsigned short x, int bit) {

    return ((1 << bit) & x);
}

瓦尔特

答案 1 :(得分:0)

你的解决方案似乎是正确的,但要回答为什么它不起作用你应该发布失败的案例。

然后尝试这种方式,并分享您的观察结果:

short is_set(unsigned short x, int bit) {    
    return (!!((1u << bit) & x));
}

答案 2 :(得分:0)

根据@Eric和@MadHatter的建议创建测试用例:

void Test(short x, int i, int expect) {
  printf("Expect %d, is_set(%#x,%d) --> ", expect, x,i);
  fflush(stdout);  // Flush output as is_set() may fail.
  int result = is_set(x,i);
  printf(" %d,  %s\n", result, expect == result ? "Success" : "Fail");
}

void Tests(void) {
  Test(0x0000, 0, 0);
  Test(0x0001, 0, 1);
  Test(0x1234, 2, 1);
  Test(0x1234, 3, 0);
  // etc.
}
Expect 0, is_set(0,0) -->  0,  Success
Expect 1, is_set(0x1,0) -->  1,  Success
Expect 1, is_set(0x1234,2) -->  1,  Success
Expect 0, is_set(0x1234,3) -->  0,  Success

该功能正确执行“如果x中的位i置位则返回1,否则返回0”。

轻微:将代码命名与要求匹配。

// Return 1 iff bit i in x is set, 0 otherwise
//                                 v 
short is_set(unsigned short x, int i) {

次要:返回值为1和0.除非另有说明,否则这应该意味着int

int is_set(unsigned short x, int i) {