分类: C/C++
2009-03-23 15:06:16
一、如果要对一个整数中的某些位进行操作,怎样表示这些位在整数中的位置呢?可以用掩码(Mask)来表示,比如掩码0x0000ff00表示对一个32位整数的8~15位进行操作,举例如下。
1、取出8~15位。
unsigned int a, b, mask = 0x0000ff00; a = 0x12345678; b = (a & mask) >> 8; /* 0x00000056 */
这样也可以达到同样的效果:
b = (a >> 8) & ~(~0 << 8);
2、将8~15位清0。
b = a & ~mask; /* 0x12340078 */
3、将8~15位置1。
b = a | mask; /* 0x1234ff78 */
4、从异或的真值表可以看出,不管是0还是1,和0做异或值不变,和1做异或得到原值的相反值。可以利用这个特性配合掩码实现某些位的翻转,例如:b = a ^ mask; /* flip the 6th bit */
temp = a; a = b; b = temp;
的办法了。利用位运算可以这样做交换:a = a ^ b; b = b ^ a; a = a ^ b;
分析一下这个过程。为了避免混淆,把a和b的初值分别记为a0和b0。第一行,a = a0 ^ b0
;第二行,把a的新值代入,得到b = b0 ^ a0 ^ b0
,等号右边的b0相当于上面公式中的x,a0相当于y,所以结果为a0;第三行,把a和b的新值代入,得到a = a0 ^ b0 ^ a0
,结果为b0。