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”字节对齐。

字节对齐的宏:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值