一文让你彻底学会Java左移、右移操作

 更新时间:2025年02月21日 11:12:17   作者:凭君语未可  
这篇文章主要介绍了了Java中的位运算符,包括左移(<<)、右移(>>)和无符号右移(>>>),左移将数字的二进制位向左移动,相当于乘以2的n次方;右移将数字的二进制位向右移动,保留符号位,相当于除以2的n次方,文中介绍的非常详细,需要的朋友可以参考下

在Java中,左移 ( <<) 和右移 ( >>) 是位运算符,用于对二进制数进行移位操作。移位操作会对数字的位模式进行直接操作。

1. 左移运算符(<<)

功能:

  • 左移操作会将一个数字的二进制位向左移动指定的位数,右边用 0 填充。
  • 每向左移动一位,相当于该数字乘以2(但不是严格意义上的乘法,可能会导致溢出)。

语法:

result = value << n;
  • value 是要操作的数字。
  • n 是移动的位数。

特点:

  • 左移后会扩大数字的值(如果没有溢出的话)。
  • 右边补0。
  • 如果是负数,二进制会以补码形式参与计算。

示例:

int a = 5; // 二进制:00000000 00000000 00000000 00000101
int result = a << 2; // 左移2位:00000000 00000000 00000000 00010100(20)
System.out.println(result); // 输出:20

2. 右移运算符(>>)

功能:

  • 右移操作会将一个数字的二进制位向右移动指定的位数。
  • 符号位扩展:如果是正数,高位用0填充;如果是负数,高位用1填充(即符号位保持不变)。
  • 每向右移动一位,相当于该数字除以2(向下取整)。

语法:

result = value >> n;
  • value 是要操作的数字。
  • n 是移动的位数。

特点:

  • 对于正数,右移后高位用0填充。
  • 对于负数,右移后高位用1填充(符号位扩展)。
  • 适合处理带符号的数字。

示例:

int a = 20; // 二进制:00000000 00000000 00000000 00010100
int result = a >> 2; // 右移2位:00000000 00000000 00000000 00000101(5)
System.out.println(result); // 输出:5

int b = -20; // 二进制:11111111 11111111 11111111 11101100(补码表示)
int result2 = b >> 2; // 右移2位:11111111 11111111 11111111 11111011(-5)
System.out.println(result2); // 输出:-5

3. 无符号右移运算符(>>>)

除了 >>,Java 还提供了 无符号右移运算符 >>>

  • 无论正数还是负数,高位都用 0 填充。
  • 通常用于操作无符号数据。

示例:

int a = -20; // 二进制:11111111 11111111 11111111 11101100(补码表示)
int result = a >>> 2; // 无符号右移2位:00111111 11111111 11111111 11111011
System.out.println(result); // 输出:1073741819

总结

操作符名称功能
<<左移二进制向左移,右边补0,相当于乘以2的n次方(如果不溢出)。
>>符号右移二进制向右移,保留符号位,高位补符号位(正数补0,负数补1),相当于除以2的n次方。
>>>无符号右移二进制向右移,高位总是补0,不考虑符号位。

扩展:i <<= j

  • 在Java中,i <<= j 是一个复合运算符,它等价于 i = i << j,表示将 i 的二进制位向左移动 j 位,然后将结果赋值给 i。即将 i 左移j位,相当于 i 乘以 2 的 j 次方。

运算过程

  • i 的二进制形式会向左移动 j 位。
  • 移位后,低位用 0 补充,高位可能会溢出(超出当前数据类型范围的部分会被丢弃)。
  • 最终结果存回变量 i

示例

示例1:对正数进行左移

public class Main {
    public static void main(String[] args) {
        int i = 5; // 二进制:00000000 00000000 00000000 00000101
        int j = 2;

        i <<= j; // 等价于 i = i << j
        // 左移2位:00000000 00000000 00000000 00010100 (20)

        System.out.println(i); // 输出:20
    }
}

示例2:对负数进行左移

public class Main {
    public static void main(String[] args) {
        int i = -5; // 二进制(补码):11111111 11111111 11111111 11111011
        int j = 2;

        i <<= j; // 等价于 i = i << j
        // 左移2位:11111111 11111111 11111111 11101100 (-20)

        System.out.println(i); // 输出:-20
    }
}

示例3:可能的溢出问题

public class Main {
    public static void main(String[] args) {
        int i = 1073741824; // 二进制:01000000 00000000 00000000 00000000
        int j = 1;

        i <<= j; // 左移1位:10000000 00000000 00000000 00000000
        // 超过32位,结果变为负数(溢出)
        
        System.out.println(i); // 输出:-2147483648
    }
}

注意点

  • 左移等价于乘以2的幂

    • 每向左移1位,相当于乘以2
    • 例如:5 <<= 1 等价于 5 * 2 = 105 <<= 2 等价于 5 * 4 = 20
    • 注意,左移不会检查溢出问题,可能导致负数或错误的结果。
  • 溢出问题

    • 移位可能会导致高位被截断,特别是当操作数接近数据类型的最大值时。
  • 适用数据类型

    • 左移操作支持整型和长整型(int 和 long)。
    • 如果操作的类型小于 int(比如 byte 或 short),会被提升为 int 再执行移位运算。

总结 

到此这篇关于Java左移、右移操作的文章就介绍到这了,更多相关Java左移、右移操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Boot接口限流的常用算法及特点

    Spring Boot接口限流的常用算法及特点

    这篇文章主要给大家介绍了关于Spring Boot接口限流的常用算法及特点的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 如何使用Spring RestTemplate访问restful服务

    如何使用Spring RestTemplate访问restful服务

    这篇文章主要介绍了如何使用Spring RestTemplate访问restful服务,详细的介绍了什么是RestTemplate以及简单实现,非常具有实用价值,需要的朋友可以参考下
    2018-10-10
  • mybatis中insert返回值为1,但数据库却没有数据

    mybatis中insert返回值为1,但数据库却没有数据

    这篇文章主要介绍了mybatis中insert返回值为1,但数据库却没有数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Spring Boot 利用注解方式整合 MyBatis

    Spring Boot 利用注解方式整合 MyBatis

    这篇文章主要介绍了Spring Boot 利用注解方式整合 MyBatis,文章围绕主主题的相关资料展开详细的内容介绍,需要的小伙伴可以参考一下
    2022-05-05
  • 实例化JFileChooser对象报空指针异常问题的解决办法

    实例化JFileChooser对象报空指针异常问题的解决办法

    今天小编就为大家分享一篇关于实例化JFileChooser对象报空指针异常问题的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • java去除空格、标点符号的方法实例

    java去除空格、标点符号的方法实例

    这篇文章主要给大家介绍了关于java去除空格、标点符号的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 使用java NIO及高速缓冲区写入文件过程解析

    使用java NIO及高速缓冲区写入文件过程解析

    这篇文章主要介绍了使用java NIO及高速缓冲区写入文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • feign调用跳过HTTPS的SSL证书校验配置过程

    feign调用跳过HTTPS的SSL证书校验配置过程

    Feign默认验证SSL证书,若服务器使用自签名或内部CA证书会导致连接失败,解决方法是跳过校验,但仅限测试环境,生产环境需严格验证以确保安全
    2025-07-07
  • java 直接调用python脚本,并传递参数代码实例

    java 直接调用python脚本,并传递参数代码实例

    这篇文章主要介绍了java调用python脚本传递参数的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Spring Boot 使用 logback、logstash、ELK 记录日志文件的方法

    Spring Boot 使用 logback、logstash、ELK 记录日志文件的方法

    这篇文章主要介绍了Spring Boot 使用 logback、logstash、ELK 记录日志文件的思路详解,文中给大家提到了logback 取代 log4j的理由,需要的朋友可以参考下
    2017-12-12

最新评论