標誌位操作:
linux核心、wine、xfree86的**中都常常能見到一些這樣的標誌位操作。
現在從linux核心中的do_mount()函式中那些例子來記一下:
1949 if (flags & ms_noexec)
1950 mnt_flags |= mnt_noexec;
1956 flags &= ~(ms_nosuid | ms_noexec | ms_nodev | ms_active |
1957 ms_noatime | ms_nodiratime | ms_relatime| ms_kernmount |
1958 ms_strictatime);
flags & ms_noexec表示:
假設flags是二進位制1111,ms_noexec定義為十進位制8,那麼二進位制就是0100,那麼&操作執行完後,flags就是0100,不等於0,所以這行語句就是檢查flags有沒有設定標誌位ms_noexec。
檢查乙個標誌位。
mnt_flags |= mnt_noexec表示:
這裡的意思和上面差不多,進行或操作後,mnt_flags的mnt_noexec標誌位置位。
設定乙個標誌位。
flags &= ~ms_noexec表示:
上述語句主要是說的是 &~操作做了什麼,下面我們分析看看。
這裡還是假設flags是二進位制1111,ms_noexec定義為十進位制8,二進位制是0100,
ms_noexe進行非「~」操作後,就是二進位制的1011,再把1011和flags的1111進行&操作,得到最終的結果──1011,那 麼,我們對比可以看到,這裡就是把flags中的ms_noexe標誌位去掉,不管ms_noexe標誌位在flags中是否被置位。
除去乙個標誌位。
小技巧:
flags = 0011
0011 << 3:
向左偏移3位,等同於乘以2的3次方,乘以8. 11000
flags = 0011
1100 >> 2:
向右偏移2位,等同於除以2的2次方。
那麼下面這個呢?
(x+127)&~127
(x +127 )&~127 實際上是這個:
#define round_size(size) ((size) + align - 1) & ~(align - 1)
「align」位元組對齊。
位元組對齊的巨集:
C語言中位域
引自 這是c語言位域 冒號 問題 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為...
c語言中位段
位段以位為單位定義結構體 或共用體 中成員所佔儲存空間的長度。含有位段的結構體型別稱為位段結構。位段結構也是一種結構體型別,只不過其中含有以位為單位定義儲存長度的整數型別位段成員。採用位段結構既節省儲存空間,又可方便操作。位段結構中位段的定義格式為 unsigned 成員名 二進位制位數 例如 st...
C語言中位操作
0 0 0 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 1 1.不改變其他位的值的狀況下,對某幾個位進行設值。先對需要設定的位用 操作符進行清零操作,然後用 操作符設值。比如我要改變 gpioa 的狀態,可以先對暫存器的值進行 清零操作 gpioa crl 0xf...