Java 基础教程

Java 移位操作符

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

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
说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号