15.1.3 掩码
如果要对一个整数中的某些位进行操作,怎样表示这些位在整数中的位置呢?可以用掩码(Mask)来表示。比如掩码0x0000ff00表示对一个32位整数的8~15位进行操作,举例如下。
- 1.取出8~15位。
- unsigned int a, b, mask = 0x0000ff00;
- a = 0x12345678;
- b = (a & mask) >> 8;
- 这样也可以达到同样的效果:
- b = (a >> 8) & ~(~0U << 8);
- 2.将8~15位清零。
- unsigned int a, b, mask = 0x0000ff00;
- a = 0x12345678;
- b = a & ~mask;
- 3.将8~15位置1。
- unsigned int a, b, mask = 0x0000ff00;
- a = 0x12345678;
- b = a | mask;
习题
1.统计一个无符号整数的二进制表示中1的个数,函数原型是int countbit(unsigned int x);。
2.用位操作实现无符号整数的乘法运算,函数原型是unsigned int multiply(unsigned int x, unsigned int y);。例如:(11011)2 ×(10010)2=((11011)2<<1)+((11011)2<<4)。
3.对一个32位无符号整数做循环右移,函数原型是unsigned int rotate_right(unsigned int x, int n);。所谓循环右移就是把低位移出去的部分再补到高位上去,例如rotate_right(0xdeadbeef, 8)的结果应该是0xefdeadbe。