我已经检查了已发布的问题,但无法找到解决问题的方法......
我正在制作一个输入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(如果这会对结果产生影响)。我已经添加了一条评论,我认为问题出在哪里但不确定。
任何人都可以帮我解决这个问题。提前谢谢。
答案 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
类型。b = (1 << b);
,因为这是更漂亮的代码并且效率更高 - 许多现代CPU只能在一个指令。答案 2 :(得分:0)
printf("The bit is: %d", 1 & a>>b);