2013-04-12 50 views
3

我是一個相對不錯的程序員,我喜歡做研究和討厭提問,但是這段代碼很麻煩。 它與XQueryKeymap使用,但我完全不明白:像宏這樣的函數是什麼意思?

#define BIT(c,x) (c[x/8]&(1<<(x%8))) 

什麼是真正困擾我的是[]<<符號。但如果你能口頭說出整個事物的意義,我會非常感激。

+2

我是唯一一個拒絕編輯這個並用['CHAR_BIT'](http://en.cppreference.com/w/c/types/limits)替換'8'的人? – WhozCraig

+0

我想繼續自己的括號狂歡。那宏觀臭味。 –

+0

我不同意你們的看法,但事實是,大部分代碼都是草率的,沒有記錄,但至少它完成了工作,我(+許多其他人)已經學到了一些新東西。 – FutureSci

回答

5

它將數據打包到char數組中。每個數組元素有8位(一個char數組),因此數組中的索引由x/8定義 - 同時1<<(x%8)將char中的8位與模數(x/8的其餘部分)相移 - - 如果設置了位x,則該宏返回非零值;如果不是,則返回0。

3

Ewww。如果c不是derefencable類型,並且x不是整數類型,則此宏將失敗。另外,沒有括號使得這更不安全。不好的代碼。

它是將x作爲位數轉換爲c中包含的內存陣列的簡稱。 <<向上移動掩碼以讀取該位,並且[]用於讀取存儲器。如果數組中的位被設置,則返回1,否則返回0 - 因此BIT名稱。