1. 程式人生 > >C語言中標誌位筆記

C語言中標誌位筆記

轉自:http://blog.csdn.net/hongmy525/article/details/4874719  非常不做的總結 

標誌位操作: 
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”位元組對齊。

位元組對齊的巨集: