我还是编程新手,我想问一下关于C
语言的一个具体问题。我正在使用codeblocks编译器。
这是一段代码:
int n, c, k;
scanf("%d",&n);
for(c = 31;c >= 0;c--)
{
k = n >> c;
if(k & 1)
printf("1");
else
printf("0");
}
return 0;
我从一个网站获得并将基数转换为二进制数据。
我的问题是,我有if& else语句,为什么有(k& 1)printf(“1”)?我认为k可以是1和0,如果我使用(k& 1),有两个选项,如(0& 1)= 0和(1& 1)= 1.可以请任何人解释我这个? 非常感谢你。
答案 0 :(得分:3)
if语句内部的表达式始终计算为true或false。就整数而言,0表示错误,任何非零表示均为真。当你有k & 1
时,这意味着如果k
的最低有效位为1,那么该表达式的计算结果为1,因此被认为是真的。如果k
的最低有效位为0,则表达式的计算结果为0,因此被认为是假。
答案 1 :(得分:1)
在我开始时帮助我的一件事是手动'使用纸笔完成代码几次。
举个例子,让我们考虑你的循环(但是使用8位整数而不是32位整数):
for(c = 7; c >= 0; c--)
{
k = n >> c;
if(k & 1)
printf("1");
else
printf("0");
}
我假设你的例子中的其他代码没有改变。此外,假设用户输入218(或二进制11011010)。
第一次迭代:
n is 218, c is 7.
we do a right shift 7 (n >> c) which makes k 00000001
we do a bit-wise `and' of k and 1 (K & 1), which is 1 or true
we print "1"
第二次迭代:
n is 218, c is 6.
we do a right shift 6 (n >> c) which makes k 00000011
we do a bit-wise `and' of k and 1 (k & 1), which is 1 or true
we print "1"
第三次迭代:
n is 218, c is 5.
we do a right shift 5 (n >> c) which makes k = 00000110
we do a bit-wise `and' of k and 1 (k&1), which is 0 or false
we print "0"
依旧......
所以,你是正确的,k可以是0或1,但是每次循环时它只假设其中一个值。
最后,如果您不清楚按位如何`和'工作时,它查看两个数字中的第n位,如果它们相同,则将结果的第n位设置为1(1),否则将结果设置为零(0)。考虑按位和218与15:
218 is 11011010 e.g. third bit from right is zero
15 is 00001111 e.g. third bit from right is one
-----------------
& 00001010 e.g. third bit from right is zero