[英]Bit Setting and Bit Shifting in Ansi C
任何人都可以解釋這種按位操作語法嗎?
#define Bitset(var,bitno) ((var) |=1UL<<(bitno))
我知道它設置var
的位,但我無法理解語法。
讓我們一塊一塊地分解它:
1UL
是一個unsigned long int
,其值為1,表示為位:
00000000000000000000000000000001
<<
是一個“位移”運算符,它將該值中的所有位移到左側bitno
的次數。 如果它是1UL<<5
,你將最終得到:
00000000000000000000000000100000
一旦你有了這個值, |=
(這是一個帶有賦值的按位OR運算 )將基本上強制與該1
一致的var
位為1
並且不會觸及任何其他位,因為( X | 0 = X
)
讓我們說var
是37
而bitno
是7
。 然后位級別的所有內容將如下所示:
00000000000000000000000000100101 // var
00000000000000000000000010000000 // 1UL<<7
00000000000000000000000010100101 // var | (1UL<<7)
最后,如果是不明確的, #define
標記Bitset
為函數宏 。
這是一個宏。 每當預處理器遇到類似Bitset(var,bitno)
的語句時Bitset(var,bitno)
它就會忠實地替換它
var = var | 1UL << (bitno)
進一步解釋這個。
UL在這里表示無符號長 。
運營商|
用於bitwise OR
運算。 所以變量var
與1UL << bitno
OR
1UL << bitno
並分配回var
然后在運行時或編譯時,取決於程序的性質,
Say var
是01000110
, bitno
是5
然后1UL << 5 = 32
或00100000
然后
var = 01000110 | 00100000
即var = 01100110
假設var = 8,即二進制的0000 1000
。
如果你這樣做
8 | 16
8 | 16
你將有0000 1000 | 0001 0000
0000 1000 | 0001 0000
這將給你0001 1000
,因為|
如果任一位為1,則運算符設置該位。
所以你正在應用|
運算符為您的值和1<<n
,即0000 0001
向左移位n位。
例如, 1 << 3
是0000 0001 << 2 = 0000 0100
。
實質上:做Bitset(8,3)
將生成一個掩碼,只有第三位設置為1 << 3
,得到0000 0100
。 然后將“或”這個掩碼設為8,給出: 0000 1000 | 0000 0100
0000 1000 | 0000 0100
,結果為0000 1100
,即設置第3位為8。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.