我檢討一些C代碼,並發現了一個頭文件充滿風格的定義:??這是什麼「的#define BLABLABLA(1 << 2)平均
#define BLABLABLABLA (1 << 2)
#define XXXXXXXXXXXX (1 << 3)
#define YYYYYYYYYYYY (1 << 4)
含義是什麼做什麼他們這樣做?
我檢討一些C代碼,並發現了一個頭文件充滿風格的定義:??這是什麼「的#define BLABLABLA(1 << 2)平均
#define BLABLABLABLA (1 << 2)
#define XXXXXXXXXXXX (1 << 3)
#define YYYYYYYYYYYY (1 << 4)
含義是什麼做什麼他們這樣做?
< <是C. 移位算所以你定義BLABLABLABLABLA通過零值與由2位數字向左移位一個二進制1。
結果值則是: ... 00000100
你通常會做這做面膜的事情。 因此,假設你有一個狀態字節,每一位都是一個標誌。 如果第三位被設置,這意味着BLABLABLABLABLA,你會這樣做:
int blablaFlag = statusByte & BLABLABLABLABLA;
如果這個值大於0,表示您的標誌已設置。
他們定義常量,使用C預處理程序。所以,你在你的代碼將與1 << 2
由預處理器來代替使用XXXXXXXXXXXX
每次的一種方式。
#define
只是意味着只要BLABLABLABLA
是看,是換成(1 << 2)
。
所以,如果你寫int x=BLABLABLABLA;
,就好像你寫了int x=(1 << 2);
。
<<
是左移操作符。
這些定義可以在比特存儲信息(標誌)時,可以使用:
#define HAS_SOMETHING (1 << 2)
#define HAS_ANOTHER (1 << 3)
int flags = 0;
if (has_something())
flags |= HAS_SOMETHING;
if (has_another())
flags |= HAS_ANOTHER;
// ... later:
if (flags & HAS_SOMETHING)
do_something();
使用
宏
預處理指令設置或取消設置這些標誌使代碼的方式比這會更易讀:
if (flags & 4) // 4 is 1 lsh 2
do_something();
<<
和>>
是轉變運營商,他們在二進制工作。
42用十進制表示42,二進制表示爲101010。
當您使用的運營商:
The binary representation of 42 is : 101010
42 << 1 : 101010 is "shifted" to the left, becoming 1010100, thus 84.
42 >> 1 : 101010 is "shifted" to the right, becoming 10101, thus 21.
這是用於標記爲可讀性目的:它更易於閱讀1 << 1
,1 << 2
,1 << 3
比1
,2
,4
。
哪部分你不明白? – AakashM 2012-02-16 10:24:58