掩码应用实例

一、什么是掩码

如果要对一个整数中的某些位进行操作,可以用掩码(Mask)。比如掩码0x0000ff00表示对一个32位整数的8~15位进行操作。

//取出8~15位
unsigned int a, b, mask = 0x0000ff00;
a = 0x12345678;
b = (a & mask) >> 8; /* 0x00000056 */

二、掩码应用实例

此例记录处理QQ围棋wgs棋谱积分信息时掩码的运用。由于积分信息是要算补码的,负积分求反码时,由于int可能是4个字节,即32位,单字节的ff取反后为ffffff00,不是希望的结果,这里只希望取后8位。

如积分信息:fe fe ff ff,倒序排列,求补码是10110,换算为积分是-272。设置掩码为 0x000000ff下面是用掩码和不用掩码取反的对比:

tmp[0] = ffffff00
tmp[0] = 0
tmp[1] = ffffff00
tmp[1] = 0
tmp[2] = ffffff01
tmp[2] = 1
tmp[3] = ffffff01
tmp[3] = 1

显然,如果不用掩码,得出的结果会非常的大。下面是代码

else if(tmp[0]>=128)
	{
		//负积分要求反码,由于int可能是4个字节,即32位,ff取反后为ffffff00,不是希望的结果,这里只取后8位即可
		unsigned int mask=0x000000ff;
		for(int i=0;i<4;i++)
		{
			tmp[i] = ~tmp[i];
			cout<<hex<<"tmp["<<i<<"] = "<<tmp[i]<<endl;
			//tmp[i] = (~tmp[i])&mask;
			tmp[i]=tmp[i]&mask;
			cout<<"tmp["<<i<<"] = "<<tmp[i]<<endl;
		}
		rank=tmp[0]*16777216+tmp[1]*65536+tmp[2]*256+tmp[3]+1;
		rank=-rank;
	}

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注