C語言中標誌位筆記

2021-05-11 11:32:26 字數 1322 閱讀 6212

標誌位操作:

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