使用c中的位和字节

时间:2014-04-10 22:20:23

标签: c byte masking bits

我已经检查了已发布的问题,但无法找到解决问题的方法......

我正在制作一个输入2个变量的控制台程序:1是一个字节,另一个是我需要使用masking和if语句从该字节获取的位数。

int E1 () {
    unsigned char a, b, c;

    printf("Number (byte):");
    scanf("%d", &a);
    a= (unsigned char)a;
    printf("\n Bit you want to output (between 0 and 7) :");
    scanf("%d", &b);
    b=(unsigned char)pow((float)2.0,b);
    printf("Mask is: %d", b);
    c= a & b; //<-- This returns 0
    if (c>0) {
    printf("\n\nThe bit is: 1");
    }
    else {
        printf("\n\nThe bit is: 0");
    }
    return 0;
}

我问过我的老师,他说它应该可以正常工作。我试过了它并没有用。他正在使用Visual Studio Express,这是一个可以从微软网站获得的免费版本,而我正在使用Code :: Blocks(如果这会对结果产生影响)。我已经添加了一条评论,我认为问题出在哪里但不确定。

任何人都可以帮我解决这个问题。提前谢谢。

3 个答案:

答案 0 :(得分:3)

使用1<<b作为掩码。它不仅是惯用的,而且比使用浮点计算更有效。所以删除这一行:

b=(unsigned char)pow((float)2.0,b);

并像这样设置c

c = a & (1<<b)

这有效吗?

答案 1 :(得分:2)

有些测试告诉我,这部分是错误的:

scanf("%d", &a);

这实际上是未定义的行为:它可能会也可能不会起作用,但你无法真正依赖任何东西。这是因为虽然a只是一个1字节的字符,而%d期望一个4字节的整数,这意味着scanf写入四个字节的内存而不是一个。

这有一个令人遗憾的副作用,即第二次调用(到scanf("%d", &b))可能会使用存储程序中某些其他变量的内存,在本例中为a。这会被覆盖并设置为0,从而导致表达式0 & b,当然评估为0

解决此问题的正确方法是使用%hhd代替%d,这会使scanf期望char而不是int,并且只写1个字节的内存。


关于您的代码的附注

  • a = (unsigned char) a;没用,因为a已经是unsigned char类型。
  • 正如Graham在他的回答中指出的那样,你应该在计算2的幂时使用b = (1 << b);,因为这是更漂亮的代码并且效率更高 - 许多现代CPU只能在一个指令。

答案 2 :(得分:0)

printf("The bit is: %d", 1 & a>>b);