我正在努力解决下面的代码,它用于将整数转换为二进制。有人能更清楚地解释一下吗?特别是' 0' +
for (;d>0;d--){
buffer[index++] = '0'+ (x & 1);
x >>= 1;
}
答案 0 :(得分:1)
这是一个以包含某个值的变量开头的循环,然后创建一个包含1和0的字符数字的字符串。
'0' + (x & 1)
获取数字零'0'
的字符,然后将该字符添加到x的最右位的值,该值的值为零或一。如果该位为零,则加法的结果为'0'
,如果该位为1,则加法的结果为'1'
。
然后将此字符放入缓冲区,变量x
右移一位,将下一个二进制数字移动到最右边的位置。
然后重复添加。
结果是你有一个0和1的文本字符串作为字符数字。
您确定这是正确的源代码吗?在我看来,为了正确表示二进制值,需要反转文本字符串结果。
答案 1 :(得分:1)
buffer[index++] = '0'+ (x & 1);
这一行通过一个char数组进行,将每个字符设置为字符'0'加上一个等于0或1的值.'0'+ 0是'0'。 '0'+ 1是'1'。 x& 1将是0或1是因为该代码基本上检查x中的低位是否打开。这样做的原因是因为下面的行正确地将x移位1,然后将x设置为等于该值,这基本上是将低位移除,并将所有其他位移过1.这样,遍历x,并检查每一位。
但请注意。看来它会写成BACKWARDS!
答案 2 :(得分:1)
在ASCII 0 中,ASCII值为48, 1 的ASCII值为49.如果你写了putchar(48),请执行IOW。你在屏幕上看到0
该缓冲区可能是一个char二维数组 48或49,因为x& 1评估为1或0。
所以说你有一个x = 225的值,并希望将它转换为包含0和1的可读文本
225在二进制文件中看起来像这样
1110 0001
当你执行1110 0001 & 0x1
时,你屏蔽了最后一个0000 0001
所以加1到48然后将一个字符转换为 1
接下来,比特向右移动x>>> = 1
0111 0000
使用0x1屏蔽0000 0000
所以添加0到48并将总和转换为字符变为 0
依此类推,直到x为0
答案 3 :(得分:1)
首先,“index”初始化为0.但“d”的定义是什么? 我们有一个名为“buffer”的字符数组,“x”是要转换的整数。 现在,在“x& 1”,“&”中是Bitwise AND operator。如果我们操作“x& n”,它会将最后n个最低有效位更改为
1 & 1 = 1,
1 & 0 = 0,
0 & 1 = 0,
0 & 0 = 0.
如果我们执行4& 1,
100
001
---
000
然后,它返回0.
如果我们执行9& 1,
1001
0001
----
0001
然后,它返回1.
基本上,如果x是偶数,则x& 1返回0,或者如果x是奇数则返回1。 现在,在此之后,这个0或1被添加到'0'(ascii 48),这是 - 如果x是偶数,则'0'+(x& 1)保持'0',否则它变为'1',因为x& 1返回1而'0'+ 1是'1'。 之后在“x>> = 1”,“>>”中是Bitwise right shift operator,相当于x = x / 2或x / = 2.但如果我们考虑整数,则会有一点差别。 考虑x = 12,即二进制为1100。
if we execute x >>= 1, then x becomes 6, if shifts away last 0 of 1100, becomes 110.
again if we execute x >>= 1, then x becomes 3, if shifts away last 0 of 110, becomes 11.
again if we execute x >>= 1, then x becomes 1, if shifts away last 1 of 11, becomes 1.
again if we execute x >>= 1, then x becomes 0, if shifts away last 1 of 1, becomes 0.
最后,如果x是偶数,它在缓冲区[index]中存储'0',否则存储'1',直到x不为0.