您的位置:首页 > 其它

位操作的一些常用用法

2014-09-04 22:25 169 查看
参考: 位操作基础篇之位操作全面总结

位操作有6种基本操作符,按照优先级分别是:

取反 ~

移位 << >>

与 &

异或 ^

或 |

常用的用法有:

1 判断偶数,判断最低位是0还是1即可,比求模快

x % 2      != 0       //x正负都可以判断;不用x%2 == 1,因为如果x为负奇数,x%2=-1
x & 0x1 == 0


2 交换两个数,不用中间变量

void mySwap(int &a, int &b)
{
if(a == b)    //相等时也能得到正确结果,但是没必要了
return;

a ^= b;
b ^= a;
a ^= b;
}


3 求整数的二进制表示中1的个数,不用一个一个的移位判断

int numOfBit1(int a)
{
int cnt = 0;
while(a != 0)
{
  ++cnt;
  a &= a - 1;    //将最右边的1置为0;正负都可计算,负数是按照补码计算的,最后的符号位也被统计
}
return cnt;
}


4 正负转换,不使用正负号。不管正数负数,取反后加1即可

int a = 1;
a = ~a + 1;   //a变成-1
a = ~a + 1;   //a又变成1


5 求绝对值,不判断正数负数,不使用正负号,返回绝对值

int myAbs(int a)
{
int sign = a >> 31;           //如果a为正数,sign为0;否则sign为-1,即0xFFFFFFFF
return (a^sign) - sign;    //(a^0)-0 = a,  (a^-1)-(-1) = ~a+1 = -a  ,a^-1即为a取反
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: