Chinaunix首页 | 论坛 | 博客
  • 博客访问: 34293
  • 博文数量: 10
  • 博客积分: 1535
  • 博客等级: 上尉
  • 技术积分: 108
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 19:50
文章分类
文章存档

2010年(10)

我的朋友

分类: C/C++

2010-08-27 23:22:33

标志位操作: 
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”字节对齐。

字节对齐的宏:

阅读(3010) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~