位运算符有:<< , >> , >>> , & , | , ^ , ~
下面通过实验来学习这几种运算
以下的数据类型是 int 用32位表示,二进制右边的0省略
// 21和-21的二进制表示
System.out.println( Integer.toBinaryString(21)); // 10101
System.out.println(Integer.toBinaryString(-21)); // 11111111111111111111111111101011
// << 带符号位向右移 移动n位即乘以2的n次方(输出结果为下面注释)
System.out.println(“21 << 4 : ” + Integer.toBinaryString(21 << 4) + ” to decimate: ” + (21 << 4));
// 21 << 4 : 101010000 to decimate: 336
System.out.println(“-21 << 4 : ” + Integer.toBinaryString(-21 << 4) + ” to decimate: ” + (-21 << 4));
// -21 << 4 : 11111111111111111111111010110000 to decimate: -336
// >> 带符号位向左移 高位补符号位 移动n位即除以2的n次方(输出结果为下面注释)
System.out.println(“21 >> 3 : ” + Integer.toBinaryString(21 >> 3)+ ” to decimate: ” + (21 >> 3));
// 21 >> 3 : 10 to decimate: 2
System.out.println(“-21 >> 3 : ” + Integer.toBinaryString(-21 >> 3)+ ” to decimate: ” +(-21 >> 3));
// -21 >> 3 : 11111111111111111111111111111101 to decimate: -3
// >>> 不带符号位左移 高位补0
System.out.println(“21 >>> 3 : ” + Integer.toBinaryString(21 >>> 3) + ” to decimate: ” + (21 >>> 3));
// 21 >>> 3 : 11111111111111111111111111101011 to decimate: 2
System.out.println(“-21 >>> 3 : ” + Integer.toBinaryString(-21 >>> 3)+ ” to decimate: ” + (-21 >>> 3));
// -21 >>> 3 : 11111111111111111111111111101 to decimate: 536870909
System.out.println(Integer.parseInt(“11111111111111111111111111101”, 2)); // 转为十进制
// 536870909
// & 第一个操作数的第n位 与 第二个操作数的第n位 相同为1时为1 其他情况为 0
System.out.println(4 & 1); // 100 & 1 = 0
System.out.println(5 & 1); // 101 & 1 = 1
System.out.println(5 & 3); // 101 & 11 = 1
// | 第一个操作数的第n位 或 第二个操作数的第n位 其中一个为1就为1
System.out.println(5 & 2); // 101 & 10 = 111 = 7
// ^ 第一个操作数的第n位 异或 第二个操作数的第n位 相同为1 不同为0
System.out.println(5 ^ 3); // 101 ^ 11 = 110 = 6
// ~ 操作数的第n位为1,那么结果的第n位为0,反之。
System.out.println(~5); // ~00101 = 11010 = -6
(转~)应用:
1. 判断int型变量a是奇数还是偶数
a&1 = 0 偶数
a&1 = 1 奇数
2. 求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。
(x&y)+((x^y)>>1);
3. 对于一个大于0的整数,判断它是不是2的几次方
((x&(x-1))==0)&&(x!=0);
4. 比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效
x ^= y;
y ^= x;
x ^= y;
5. 求绝对值
int abs( int x ){
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
6. 取模运算,采用位运算实现:
a % (2^n) 等价于 a & (2^n – 1)
7. 乘法运算 采用位运算实现
a * (2^n) 等价于 a << n
8. 除法运算转化成位运算
a / (2^n) 等价于 a>> n
9. 求相反数
(~x+1)
10 a % 2 等价于 a & 1