将基数10转换为基数2,C编程

时间:2014-07-05 12:52:23

标签: c binary codeblocks

我还是编程新手,我想问一下关于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.可以请任何人解释我这个?  非常感谢你。

2 个答案:

答案 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
相关问题