0 0

& 的作用?5

在环形队列中,用下面的代码判断它是否满了
        /*
         * check for full ring.  If the queue is full and we have not
         * already scheduled a timeout, do so here.
         */
        nexthead = (rnd_head + 1) & (RND_EVENTQSIZE - 1);
        if (nexthead == rnd_tail) {


请问这个 & 是怎么回事?

这个队列总是保留一个空位用来区分空和满的情况。RND_EVENTQSIZE 表明队列数 rnd_head 指向队列头,rnd_tail 指向队列尾。

这段代码没有错误,出自 netbsd。附件是这段代码所在的源码。

谢谢!
问题补充:
I got it. 在源码中有这样的定义:

sys/sys/rnd.h:#define RND_EVENTQSIZE 128

RND_EVENTQSIZE 是 2 的 n 次幂,这时

(rnd_head + 1) & (RND_EVENTQSIZE - 1)

相当于

(rnd_head + 1) % RND_EVENTQSIZE

非常感谢大家的热心!
C 
2009年10月14日 19:16
  • rnd.c.tar.gz (6.6 KB)
  • 描述: 程序源码
  • 下载次数: 0

1个答案 按时间排序 按投票排序

0 0

位运算符C语言提供了六种位运算符:
    &          按位与

    |          按位或

    ^          按位异或

    ~          取反

    <<         左移

    >>         右移

12.1.1            按位与运算
    按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。

例如:9&5可写算式如下:

      00001001        (9的二进制补码)

     &00000101        (5的二进制补码)

      00000001        (1的二进制补码)

可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 ,保留低八位,可作a&255运算( 255 的二进制数为0000000011111111)。

【例12.1】

main(){

    inta=9,b=5,c;

    c=a&b;

   printf("a=%dnb=%dnc=%dn",a,b,c);

}

2009年10月14日 19:25

相关推荐

Global site tag (gtag.js) - Google Analytics