void getBin(int num, char *str)
getBin()
接受一些(num
)和一个字符串写入(str
)
*(str+16) = '\0';
的str
的最后一个字符设置为NULL终止
int mask = 0x8000 << 1;
我们创造一个名为mask
的变量并将其设置为0x8000,左移1,即0x10000。为什么?可能更容易在二进制看到:
为0x8000 => 1000 0000 0000 0000 (然后移动一切左1米的地方) => 0x10000的
while(mask >>= 1)
虽然mask
大于0,我们右移1位,并返回结果保存到mask
。 (>>=
表示右移并保存)。这意味着这些值将是:
0x10000的 == 1 000 0000 0000 0000 == 65536
为0x8000 == 1000 0000 0000 0000 = = 32768
0x4000的 == 100 0000 0000 0000 == 16384
为0x2000 == 10 0000 0000 0000 == 8192
...
为0x4 == 100 == 4
0X2 == 10 == 2
0x1 == 1 == 1
最后在每个这些迭代:
*str++ = !!(mask & num) + '0';
此代码正在每个数字在num
,与1 AND'ing的它在mask
中设置,并检查结果是否为== 0
,然后它将字符0
的值加上并将最后的ASCII“number”存储到字符串中,然后递增该字符串。
让我们打破下来一步步时间:
mask & num // num is 3334 = 0011 0011 0011 0100
// mask starts at = 1000 0000 0000 0000
所以在第一次循环的(mask & num)
值0
。
!!(x)
是一样的话说:(x == 0 ? 0 : 1)
所以在第一次循环,我们有一个0
所以!!(0)
给我们0,我们要存储到我们的字符串,但我们希望它是一个ASCII字符。为0的ASCII字符的0x30 所以我们添加的0x30为0,得到的0x30(或'0'
)然后
*str++ = '0';
我们提领str
并存储字符0,那么我们有后增量移动到下一个字符串中的字符。
另请注意,代码将在8位或16位计算机上崩溃并刻录,其中int为16位。 – Lundin 2013-03-13 07:49:53
很高兴知道。如果像MSP430这样的16位微处理器运行,任何人都有更好的方法? – cii 2013-03-13 17:49:01