移位运算符在程序设计中,是位操作运算符的一种,移位运算符可以在二进制的基础上对数字进行平移。
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