这是讲座幻灯片的材料,但我似乎无法掌握这一部分:
binaryString[i] = ((number & 1) + '0')
检查每个位是否为1/0。
这是整个街区。
char *intToBinary(unsigned int number) {
char *binaryString = malloc(32+1);
int i;
binaryString[32] = '\0';
for (i = 31; i >= 0; i--) {
binaryString[i] = ((number & 1) + '0');
number = number >> 1;
}
return binaryString;
}
让我们一点一点地打破binaryString[i] = ((number & 1) + '0')
:
首先,我们来看看(number & 1)
。这将检查number
中的最低有效位是否为1。如果是,则此表达式的计算结果为1,否则计算结果为0。
((number & 1) + '0')
获取此前计算的结果并将其添加到0
。如果number
的最低位数是0
,我们添加'0'
和0
,得到'0'
。否则,我们添加1
和'0'
,获得'1'
。这是有效的,因为在C中,字符是数字类型,因此您可以添加它们; '0'
之后的角色是'1'
,因此将1
添加到'0'
会给'1'
。
然后我们将这个结果('1'
或'0'
)存储在我们的字符串中。
最后,我们将number
一个接一个地移开,摆脱我们刚才看到的位:number = number >> 1;
。
对于最右边的位为1的数字,此(number & 1)
将返回1,否则返回0。 & 1
通过将所有位(最右边的位除外)设置为0来工作,因为1就像二进制中的00000001
。
所以
XXXXXXXY
00000001 &
0000000?
如果Y
为0,则如果Y
为1或0则为1。
在此之后来了+ '0'
。这是一个肮脏的技巧,但是当你获得ASCII表时很容易理解。 '0'
的值在ASCII表中是48(十进制),'1'
是49.所以((number & 1) + '0')
会像(0 + '0')
那样是'0'
或(1 + '0')
,这是'1'
。简而言之,他在这里填充了binaryString
中的1和0字符。