完成@ RhythmicFistman的回答
@ RhythmicFistman的回答是缺少一個小的一部分,它和這是輪班的最後一步。
的>> (7-((y)&0x07)
步驟確保你永遠只能得到1或0的結果有了這個代碼是安全的不喜歡攀比:
if (testbit(varible, 6) == 1) {
// do something
}
凡未經那一步testbit
將返回位掩碼中第6位將被設置爲1或0,並且所有其他位總是被設置爲0.這是意圖,但是它並沒有在被認爲是便攜式方式中實現,參見警告3以下。
使用此代碼
我們添加一些其他的答案可能出現的問題。其他答案還沒有指出應該在這裏提到的一些關鍵字,它們是strict aliasing和shift arithmetic right。我的闡述將以下面的警告形式出現。
警告1:Endianness
此代碼假定您使用的是big endian架構或者只想從字符數組得到正確的位。
的原因是,當你轉換的int
成char
S(字節)的數組,你會得到一個big endian機上不同的結果Vs的little endian機。
警告2:Strict Aliasing
宏利用鑄造(const char*) &(x)
,其目的是改變類型,也叫做別名的(x)
,使其更容易得到正確的位。
這是危險的,其原因是在this SO answer精美地解釋。簡短的版本是,如果您通過優化編譯此代碼,可能會發生奇怪的事情。
Aliasing和Pointer Aliasing上的維基百科頁面也很有用,應該閱讀。
警告3:Shift Arithmetic Right
除了這個有可能是與此代碼使用右移操作>>
方式的潛在問題。該操作符具有兩種不同的行爲,具體取決於其操作的變量是有符號的還是無符號的。只要你從不使用負數,你就會安全,但是這段代碼不會保護你免受這個錯誤。不過,我懷疑,無論如何你都不太可能犯這樣的錯誤,所以應該可以使用它。
另外值得一提的是,您正在使用signed char
,並且正在向右移動。雖然這有效,但我更希望unsigned char
這將提高可移植性,因爲當char
和int
是相同的寬度(實際上幾乎從未如此,授予)時,它不會產生算術右移。這是可行的,因爲char
提升爲int
換班,請參閱this SO answer的解釋。
爲什麼downvote?因爲它提到了一個宏?這是一個很好的問題。只需將轉換和位掩碼操作分解爲不同的步驟即可。我只是懶惰地回答... –