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

int to binary code explanation C++

本文关键字:解释 C++ 代码 二进制 int      更新时间:2023-10-16

我很难理解下面的代码,它用于将整数转换为二进制。有人能更准确地解释吗?尤其是"0"+

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

首先,"index"初始化为0。但是"d"的定义是什么?我们有一个名为"buffer"的字符数组,"x"是要转换的整数。现在,在"x&1"中,"&"是位AND运算符。如果我们操作"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"中,">>"是位右移运算符,相当于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为偶数,它将"0"存储在缓冲区[index]中,否则将存储"1",直到x不为0。

这是一个循环,从包含某个值的变量开始,然后创建一个由1和0组成的字符串。

'0' + (x & 1)取数字0的字符'0',然后将x的最右边的位的值加到该字符上,该位的值要么为0,要么为1。如果比特为零,则相加的结果为'0',如果比特为1,则相加结果为'1'

然后将该字符放入缓冲区,变量x右移一位,将下一个二进制数字移到最右边。

然后重复添加。

结果是,您得到了一个以0和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!

在ASCII中,0具有ASCII值48,而1具有ASCII值49。IOW如果你写putchar(48(;你在屏幕上看到一个0

缓冲区可能是一个char二维数组,已分配48或49,因为x&1的计算结果为1或0。

假设您有一个值x=225,并希望将其转换为包含0和1的的可读文本

225在二进制中看起来像这样

1110 0001

当你做1110 0001 & 0x1时,你屏蔽掉最后剩下的1个是0000 0001

因此将1加至48并将总和转换为字符是1

接下来,比特向右移动一步x>>=1

0111 0000

用0x1掩蔽的是0000 0000

所以把0加到48并把和转换成一个字符就变成了0

依此类推,直到x为0