簡體   English   中英

Ansi C中的位設置和位移

[英]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

讓我們說var37bitno7 然后位級別的所有內容將如下所示:

00000000000000000000000000100101  // var
00000000000000000000000010000000  // 1UL<<7

00000000000000000000000010100101  // var | (1UL<<7)

最后,如果是不明確的, #define標記Bitset函數宏

這是一個宏。 每當預處理器遇到類似Bitset(var,bitno)的語句時Bitset(var,bitno)它就會忠實地替換它

var = var | 1UL << (bitno)

進一步解釋這個。

UL在這里表示無符號長

運營商| 用於bitwise OR運算。 所以變量var1UL << bitno OR 1UL << bitno並分配回var

然后在運行時編譯時,取決於程序的性質,

Say var01000110bitno5

然后1UL << 5 = 3200100000

然后

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 << 30000 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM