int到二进制代码解释C ++

时间:2014-06-11 18:14:41

标签: c++

我正在努力解决下面的代码,它用于将整数转换为二进制。有人能更清楚地解释一下吗?特别是' 0' +

for (;d>0;d--){
    buffer[index++] = '0'+ (x & 1); 
    x >>= 1;
}

4 个答案:

答案 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.