Java定义的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long(64位)、int(32位)、short(16位)、char(16位无符号)、byte(8位),其中 1字节等于8位,即1 byte = 8 bit。
位运算说穿了,就是直接对整数在内存中的二进制位进行操作。
整数类型 | 范围 -2^(n-1) ~ 2^(n-1)-1 | java计算最大值 |
long | -2^63 ~ 2^63-1 | Long.MAX_VALUE |
int | -2^31 ~ 2^31-1(-2147483648 ~ 2147483647) | Integer.MAX_VALUE |
char | 0 ~ 2^16-1(0 ~65535) | Short.MAX_VALUE |
short | -2^15 ~ 2^15-1(-32768 ~ 32767) | Character.MAX_VALUE + 0 |
byte | -2^7 ~ 2^7-1(-127 ~ 128) | Byte.MAX_VALUE |
1.左移(<<) 高位舍弃,低位补0
int类型实例:5 << 2
0000 0000 0000 0000 0000 0000 0000 0101 // 5
0000 0000 0000 0000 0000 0000 0001 0100 // 向左移动2位,结果20
System.out.println(5 << 2); // 20
向左移n 位,就相当于乘上2 的n 次方。
即5向左移动2位,结果5 * 2^2 = 20。
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位。
2.右移(>>)高位补符号位(即正数补0,负数补1),低位舍弃
int类型实例1:5 >> 2
0000 0000 0000 0000 0000 0000 0000 0101 // 5
0000 0000 0000 0000 0000 0000 0000 0001 // 向右移动2位,结果1
System.out.println(5 >> 2); // 1
右移n 位,就相当于除上2 的n 次方。
即5向右移动2位,结果5 / (2^2) = 1 (向下取整。例如 1.5取值1;-1.5取值 -2)
int类型实例2:-5 >> 2
1111 1111 1111 1111 1111 1111 1111 1011 // -5
1111 1111 1111 1111 1111 1111 1111 1110 // 向右移动2位,结果-2
System.out.println(-5 >> 2); // -2
3.无符号右移(>>>) 高位补0,低位舍弃
int类型实例:-5>>>2
1111 1111 1111 1111 1111 1111 1111 1011 // -5
0011 1111 1111 1111 1111 1111 1111 1110 // 向右移动2位,高位补0,结果1073741822
System.out.println(-5 >>> 2); // 1073741822
4.按位与(&)
同时为1时,结果为1,否则为0
0011 // 3
0101 // 5
0001 // 3 & 5,结果 1
5.按位或(|)
一边为1时,结果为1,否则为0
6.按位异或(^)
两边的位不同时,结果为1,否则为0
1100 // 12
1010 // 10
0110 // 12^10,结果6
7.按位取反(~)
0变1,1变0
0000 0000 0000 0000 0000 0000 0000 1100 // 12
1111 1111 1111 1111 1111 1111 1111 0011 // ~12,结果-13
System.out.println(~12); // -13
备注:
1. java采用unicode,2个字节(16位)来表示一个字符。”中”这个中文字符的unicode就是2个字节,所以char型可以存放一个汉字。
char c ='中';
String.getBytes(encoding)方法是获取指定编码的byte数组表示,通常gbk/gb2312是2个字节,utf-8是3个字节。
2. 计算机只能识别0和1,使用的是二进制,最高位存放符号(0为正,1为负)
3.如果对char、byte或者short类型的数值进行移位处理,那么在移位进行之前,他们会被转换成int类型,并且得到的结果也是一个int类型的值。
4. java二进制、八进制、十进制、十六进制相互转换
二进制转十进制
Integer.parseInt(“110”, 2);
八进制转十进制
Integer.parseInt(“17”, 8);
十六进制转十进制
Integer.parseInt(“17”, 16);
十进制转成二进制
Integer.toBinaryString(int i);
十进制转成八进制
Integer.toOctalString(int i);
十进制转成十六进制
Integer.toHexString(int i);