位运算
从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。
位运算符号
- &:与运算,只有两个数都为1时才为1,否则为0,例如:1&1=1 1&0=0 0&0=0 0&1=0;
- |:或运算,只有两个数都为0时才为0,否则为1,例如:0 & 0 = 0 1 & 0 = 1 0 & 1= 1 1 & 1 = 1;
- ~:非运算,取反(0变1,1变0),例如: ~ 1 = 0 ~ 0 = 1;
- ^:异或运算,不进位的二进制加法,例如:0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0;
- >>:右移,二进制中所有位向右移动,最右边的位丢弃,最左边的位正数补0,负数补1.
- <<:左移,二进制中所有位向左移动,最左边的位丢弃,最右边的位补0。
- 以上运算均是二进制下的按位运算
位运算的应用
- 求两个整数的平均值
int mid = a + b >> 1
- 求二进制中1的个数
int cnt = 0; while(x) { if (x & 1) cnt++; x >>= 1; }
- 判断一个数的奇偶性
if (x & 1) { //奇数 } else { //偶数 }
- 两个数交换值
- 这里有一个性质:异或运算可以交换位置,值不变,例如:a ^ b ^ c = c ^ a ^ b = b ^ c ^ a。
x = x ^ y; y = x ^ y;//相当于 y = x ^ y ^ y = x; x = x ^ y;//相当于 x = x ^ y ^ x = x ^ x ^ y = y;