移位运算符在程序设计中,是位操作运算符的一种,移位运算符可以在二进制的基础上对数字进行平移。
Java 中,按照位平移的方向和填充数字的规则分为三种:
<< 向左移位,例如:10 << 2 表示将整数 10 的二进制形式逐位左移 2 位,右侧空余出来的 2 位使用 0 进行填充,原来最左侧的 2 位被丢弃
>> 带符号右移位,例如:10 >> 2 表示将整数 10 的二进制形式逐位右移 2 位,左侧空余出来的 2 位使用原来的符号位进行补位,原来左侧的 2 位丢弃
>>> 无符号右移位,例如:10 >>> 2 表示将整数 10 的二进制形式逐位左移 2 位,左侧空余出来的 2 位补 0,原来右侧的 2 位丢失
使用移位运算验证某个整数中指定的位数是否为1,代码如下:
import java.util.Arrays;
public class Demo {
public static void main(String[] args) {
int a = -1024;
System.out.println(" a原始值:" + format(a));
// 向左移位
System.out.println(" 向左移5位:" + format(a << 5));
// 带符号右移位
System.out.println("带符号右移5位:" + format(a >> 5));
// 无符号右移位
System.out.println("无符号右移5位:" + format(a >>> 5));
}
/**
* 将整数格式化为32个字符的二进制字符串
* @param value 带格式化整数
* @return
*/
private static String format(int value) {
String str = Integer.toBinaryString(value);
// 实现左端用字符0补齐
char[] chars = new char[32 - str.length()];
Arrays.fill(chars, '0');
String tmpStr = String.copyValueOf(chars) + str;
// 这里使用了 Java 的 StringBuilder,后续会介绍
StringBuilder buffer = new StringBuilder();
for(int i = 0; i < tmpStr.length(); i++) {
if(i > 0 && i % 8 == 0) {
buffer.append(" ");
}
buffer.append(tmpStr.charAt(i));
}
return buffer.toString();
}
}运行示例代码,输出如下:
a原始值:11111111 11111111 11111100 00000000 向左移5位:11111111 11111111 10000000 00000000 带符号右移5位:11111111 11111111 11111111 11100000 无符号右移5位:00000111 11111111 11111111 11100000
上面示例介绍了移位操作的简单使用,我们还可以通过向左移位实现计算2的n次方。代码如下:
public class Demo {
public static void main(String[] args) {
int a = 2;
System.out.println("2 的 2 次方:" + (a << 1));
System.out.println("2 的 3 次方:" + (a << 2));
System.out.println("2 的 4 次方:" + (a << 3));
}
}运行上面示例,输出结果如下:
2 的 2 次方:4 2 的 3 次方:8 2 的 4 次方:16