位操作的4例解释
程序代码:
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) 位