一、简介
1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。
2 "<<" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。
3 ">>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。
4 ">>>"运算符,右边的位被挤掉,对于左边移出的空位一概补上0。
二、常用方法(n为被操作数,k为操作数)
1、按位与 &
清零特定位----n=n&k (k的指定位为0,其他位为1)
取某数中指定位 -- n=n&k(k的指定位为1,其他位为0)
2、按位或 |
将n的某一位置为1,n=n | k 。(k的指定位为0,其他位为1)
3、位异或 ^
指定位的值取反 n = n^k 。(k的指定位为1,其他位为0)
实现两个数的交换,不使用第三个变量
a = a ^ b ; b = b ^ a ; a = a ^ b
三、应用举例
1、计算一个数的二进制中1的个数(可以参见鄙人以前的博客)
/* 计算一个数的二进制中1的个数 */ int countOf1(int num) { int count = 0; while(num) { num = num & (num - 1); count++; } return count; }
2、判断一个数是否是2的n次方
1 /* 2 判断一个数是否为2的n次方(一个数为2的n次方,则最高位为1,其余位为0) 3 */ 4 bool is2Power(int num) 5 { 6 bool flag = true; 7 8 num = num & (num - 1); //计算num和num - 1的与的结果 9 if(num) //如果结果为0,则不是2的n次方 10 { 11 flag = false; 12 } 13 14 return flag; 15 }
上面代码找个例子可以很容易的发现,也可以参见上面的链接。
3、获得最大的int值
int getMaxInt() { return (1 << 31) - 1; }
4、获得最小的int值
int getMaxInt() { return (1 << 31); }
5、判断一个数的奇偶性
/* 判断一个数的奇偶性.返回1,为奇数;返回0,为偶数 */ bool isOdd(int num) { return num & 1 == 1; }
6、交换两个数(不借助第三变量)如上
/* 不适用临时变量,交换两个数 a = a ^ b b = b ^ a a = a ^ b 或者 a = a + b b = a - b a = a - b */ void swap(int* a,int* b) { (*a) ^= (*b) ^= (*a) ^= (*b); }