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