一、什么是掩码
如果要对一个整数中的某些位进行操作,可以用掩码(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; }
发表回复