我很难理解这一点。我的教授写了一段从十进制到二进制的代码,我似乎无法理解发生了什么。有人可以像我5那样向我解释。
main() {
int i, x = 9;
for (i = 31; i >= 0; i--) {
putchar('0' + ((x >> i) & 1));
}
return (0);
}
答案 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 AND和bit 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
的单个位的值。