1.左移 <<
左移的特征:用来倍增(乘2^n,n为移动的数值)
2.右移 >>
右移的特征:用来整除(除2^n,n为移动的数值)并舍去余数
3.按位与 &
与的特征:只有两个数的二进制同时为1,结果才为1,否则为0
应用 : 与1运算,可以判断奇偶性。 A&1 = 0 (偶数). A&1 = 1 (奇数)
4.按位或 |
或的特征:数值位只要两个数中的一个为1,结果就为1
5.按位非 ~
非的特征:按位取反 (最终表现为:先加1后取反,按照这个特性,数学用途可以归纳为求相反数:~A + 1)
6.按位异或 ^
异或的特征:参加运算的两个数,如果两个相应位为"异"(值不同),则该位结果为1,否则为0
0和任意数异或结果还是其本身
任意数和自身异或结果为0,用于置0
可以判断两个数是否相等,if((A^B ) == 0)
交换两个数,a = a^b;b = b^a;a = a^b
使用:
//1. 整数的平均值
//对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
int average(int x, int y) //返回X,Y 的平均值
{
return (x&y)+((x^y)>>1);
}
//2. 判断一个整数是不是2的幂,对于一个数 x >= 0
boolean power2(int x)
{
return ((x&(x-1))==0)&&(x!=0);
}
//3. 用位运算符交换两个整数
void swap(int x , int y)
{
x ^= y;
y ^= x;
x ^= y;
}
//4. 计算绝对值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
//5. 求相反数
//x 的 相反数
(~x+1)
//6.判断奇偶性
a&1 = 0 偶数
a&1 = 1 奇数