C到二进制:putchar(' 0' +((x>> i)& 1));

时间:2014-09-01 15:01:16

标签: c

我很难理解这一点。我的教授写了一段从十进制到二进制的代码,我似乎无法理解发生了什么。有人可以像我5那样向我解释。

main() {
    int i, x = 9;
    for (i = 31; i >= 0; i--) {
        putchar('0' + ((x >> i) & 1));
    }
    return (0);
}

2 个答案:

答案 0 :(得分:4)

这个评论过的代码有望说清楚:

// C89/C90 main() function definition with implicit return type int,
// not valid C99/C11
main(){

    int i; // loop index variable
    int x=9; // number to print as binary

    for (i=31;i>=0;i--) {
          // assume that int is 32 bits (very common even on 64 bit compilers):
          // loop will iterate from bit number 31 to bit number 0, 32 bits total
          // printing is from left to right, so bit 31 must be printed first

          // shift bits so bit number i becomes bit number 0
          int bit_i_unmasked = x >> i; 

          // set other bits to 0 by using bitwise AND operator
          int bit_i = bit_i_unmasked & 1; 
          // now bit_i has value 0 or 1

          // convert bit_i to a character, '0' or '1', 
          // calculation below is either ('0' + 0) or ('0' + 1)
          char biniary_digit = '0' + bit_i;           

          // print the digit character
          putchar(binary_digit);
    }
    return 0;
}

维基百科有很好的解释和bitwise ANDbit shifts操作的例子,对你来说并不清楚。

关于移位的注意事项:在这种情况下,C对有符号整数进行算术右移并不重要,因为从不使用由位移引入的“新”位。它会产生影响,如果 x为负二进制数打印的位数多于int实际拥有的位数,例如从63到0(你可以尝试一下)。

答案 1 :(得分:3)

表达式

'0' + ((x>>i) & 1)

通过屏蔽'0'的{​​{1}}位,为字符i:th添加0或1。如果你在角色x中添加一个角色,C可以保证你获得角色'1',这样就行了。

子表达式'0'表示“取((x >> i) & 1),将其值x位向右移,然后逐位 - i,值为1” 。这会“屏蔽掉”AND位,因此子表达式将等于i:th的单个位的值。