位运算及其应用实例(2)
摘要
上一篇《C/C++刁钻问题各个击破之位运算及其应用实例(1)》受到不少网友的关注,这对我鼓励极大,首先感谢这些网友,特别要感谢几位回复的热心网友。
上一篇中我对位运算进行了简单介绍,并谈到了如何操作整数的位,比如将某位置0、置1、翻转、查询某位是否为1等,最后在这些基本的位操作上给出了3个位运算的应用实例。本篇是上一篇的续集,我将给出6个比较复杂一点的位操作,并对比较难以理解的位操作进行图文并茂的剖析,由于不想在一篇当中写太多内容,因此本篇中的这些位操作的实际应用案例我将在以后给出,即便是这样,本篇仍然非常重要,它是我们应用位运算来解决问题的基础。
上一篇中的四个基本位操作
1. 将expr的第n(n从0开始)位设置为1: expr |= (1<<n);
2. 将expr的第n(n从0开始)位设置为0: expr &= (~(1<<n));
3. 判断expr的第n(n从0开始)位是否为1:bool b = expr &(1<<n);
4. 翻转expr的第n(n从0开始)位:expr ^= (1<<n);
本篇的8个较复杂的位操作
下面介绍本篇的重点:8个较复杂的位操作。要理解这些位操作并不容易,我将使用文字+图解的方式来描述,力求讲明白,需要说明的是,为了作图方便,我假设数据都是char类型(只有8个bit),这些位操作对其他类型的数据同样适用。
1. 将最右侧的1翻转成0:x&(x-1)
假设x=01110100,那么x,x-1和x&(x-1)的二进制表示分别如下:
x: |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
x-1: |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
X&(x-1): |
0 |
1 |
1 |
|