注册 登录
编程论坛 Linux系统管理

位操作的4例解释

madfrogme 发布于 2012-07-26 21:59, 582 次点击
程序代码:

int set_in_use ( int car_num) {
     in_use = in_use | 1 << car_num;
}

上面的例子第一眼看上去很难理解,比如说car_num 为 5

上面一句的意思就是:打开 in_use 的第5位(从0位开始)

首先1被左移5位,所以只有第5位是1,其余都是 0

然后再和in_use做或(|)运算,就确保了把in_use的第5位设为1

所以说下面这句也应该比较容易理解了

程序代码:

int is_in_use ( int car_num) {
    return in_use & 1 << car_num ;
}


比如car_num 为5
这就是判断in_use 的第 5位有没有被打开了

如果被打开(即是1)则返回值为非0

如果没被打开(即是0),则返回值为0

但是当我们想关掉某1位的时候该怎么办?
程序代码:

int set_unused ( int car_num) {
    in_use = in_use & ~(1 << car_num);
}

比如car_num 为5
把1 左移5位, 再翻转,

左移除了第5位是0,其他位都为 1

再和in_use做AND 运算

就确保了其他位不变,把第5位设为0

那么再看一下下面的例子用了XOR
程序代码:

void flip_use_state ( int car_num) {
    in_use = in_use  ^ 1<< car_num;
}

上面的例子又是什么意思?

比如car_num 为 5

就是想翻转 in_use 的第5位,如果是1,就翻转成0;

如果是0, 就翻转成1

仔细看一下, 1被左移5为,所以除了第5位,其他位都是0

再和in_use 做XOR运算

不论(0还是1) 和 0做XOR运算时都不变,

但是不论(0还是1)和1做XOR运算时都被翻转,

这就是上面一句话的意思了,其他位不变,翻转第 car_num(5) 位
1 回复
#2
pangding2012-07-29 15:16
你这些技巧发到 C 区也可以,不过一般这些东西,用宏干的多。
1