Java常见运算符之位运算符大全

 更新时间:2025年04月28日 09:26:37   作者:吗喽对你问好  
这篇文章主要介绍了Java常见运算符之位运算符的相关资料,包括按位与、按位或、按位异或、按位取反、左移、右移和无符号右移,这些运算符在判断奇偶、交换变量、计算绝对值、判断是否为2的幂以及快速计算2的幂次方等方面有广泛应用,需要的朋友可以参考下

1. Java 支持的位运算符

Java 提供了 7 种位运算符:

运算符名称描述示例
&按位与(AND)两个位都为 1 时,结果才为 15 & 3 → 1
|按位或(OR)两个位有一个为 1 时,结果就为 15 | 3 → 7
^按位异或(XOR)两个位不同时,结果为 15 ^ 3 → 6
~按位取反(NOT)所有位取反(0→1,1→0)~5 → -6
<<左移(Left Shift)所有位向左移动,低位补 05 << 1 → 10
>>右移(Right Shift)所有位向右移动,高位补符号位-5 >> 1 → -3
>>>无符号右移(Unsigned Right Shift)所有位向右移动,高位补 0-5 >>> 1 → 2147483645

2. 位运算详解

(1) 按位与(&)

  • 规则:两个位都为 1 时,结果才为 1,否则为 0。

  • 示例

    int a = 5;    // 二进制:0101
    int b = 3;    // 二进制:0011
    int c = a & b; // 二进制:0001 → 1
    System.out.println(c); // 输出:1
  • 应用

    • 判断奇偶:(n & 1) == 0 → 偶数。

(2) 按位或(|)

  • 规则:两个位有一个为 1 时,结果就为 1。

  • 示例

    int a = 5;    // 0101
    int b = 3;    // 0011
    int c = a | b; // 0111 → 7
    System.out.println(c); // 输出:7
  • 应用

    • 合并多个标志位(如 READ | WRITE | EXECUTE)。

(3) 按位异或(^)

  • 规则:两个位不同时,结果为 1,否则为 0。

  • 示例

    int a = 5;    // 0101
    int b = 3;    // 0011
    int c = a ^ b; // 0110 → 6
    System.out.println(c); // 输出:6
  • 特性

    • a ^ a = 0(相同数异或为 0)。

    • a ^ 0 = a(任何数与 0 异或不变)。

  • 应用

    • 交换两个数(不使用临时变量):

      int x = 5, y = 3;
      x = x ^ y;
      y = x ^ y; // y = (x ^ y) ^ y = x
      x = x ^ y; // x = (x ^ y) ^ x = y
      System.out.println(x + ", " + y); // 输出:3, 5

(4) 按位取反(~)

  • 规则:所有位取反(0→1,1→0)。

  • 示例

    int a = 5;    // 0000 0101
    int b = ~a;   // 1111 1010(补码表示)
    System.out.println(b); // 输出:-6
  • 注意

    • Java 使用补码表示负数,~5 实际上是 -6

(5) 左移(<<)

  • 规则:所有位向左移动,低位补 0。

  • 示例

    int a = 5;    // 0000 0101
    int b = a << 1; // 0000 1010 → 10
    System.out.println(b); // 输出:10
  • 应用

    • 快速计算 a * 2^n(如 a << 3 = a * 8)。

(6) 右移(>>)

  • 规则:所有位向右移动,高位补符号位(正数补 0,负数补 1)。

  • 示例

    int a = 5;    // 0000 0101
    int b = a >> 1; // 0000 0010 → 2
    int c = -5 >> 1; // 1111 1101 → -3
    System.out.println(b + ", " + c); // 输出:2, -3
  • 应用

    • 快速计算 a / 2^n(如 a >> 2 = a / 4)。

(7) 无符号右移(>>>)

  • 规则:所有位向右移动,高位补 0(不考虑符号位)。

  • 示例

    int a = -5;    // 1111 1111 1111 1111 1111 1111 1111 1011
    int b = a >>> 1; // 0111 1111 1111 1111 1111 1111 1111 1101 → 2147483645
    System.out.println(b); // 输出:2147483645
  • 应用

    • 处理无符号整数(Java 没有无符号类型,但可以用 >>> 模拟)。

3. 位运算的常见用途

(1) 判断奇偶

if ((n & 1) == 0) {
    System.out.println("偶数");
} else {
    System.out.println("奇数");
}

(2) 交换两个数

int x = 5, y = 3;
x = x ^ y;
y = x ^ y;
x = x ^ y;
System.out.println(x + ", " + y); // 输出:3, 5

(3) 计算绝对值

int a = -5;
int abs = (a ^ (a >> 31)) - (a >> 31);
System.out.println(abs); // 输出:5

(4) 判断是否为 2 的幂

boolean isPowerOfTwo = (n & (n - 1)) == 0;
System.out.println(isPowerOfTwo); // 8 → true, 7 → false

(5) 快速计算 2^n

int power = 1 << n; // 2^n
System.out.println(power); // n=3 → 8

4. 总结

运算符用途示例
&判断奇偶、权限控制(n & 1) == 0
|合并标志位READ | WRITE
^交换变量、加密a ^= b; b ^= a; a ^= b;
~取反~5 → -6
<<快速乘以 2^n5 << 2 → 20
>>快速除以 2^n-5 >> 1 → -3
>>>无符号右移-5 >>> 1 → 2147483645

到此这篇关于Java常见运算符之位运算符的文章就介绍到这了,更多相关Java位运算符大全内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java存储以及java对象创建的流程(详解)

    java存储以及java对象创建的流程(详解)

    下面小编就为大家带来一篇java存储以及java对象创建的流程(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • java面向对象设计原则之接口隔离原则示例详解

    java面向对象设计原则之接口隔离原则示例详解

    这篇文章主要为大家介绍了java面向对象设计原则之接口隔离原则的示例详解,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-10-10
  • jdbcTemplate使用方法实例解析

    jdbcTemplate使用方法实例解析

    这篇文章主要介绍了jdbcTemplate使用方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 根据ID填充文本框的实例代码

    根据ID填充文本框的实例代码

    这篇文章介绍了根据ID填充文本框的小例子,有需要的朋友可以参考一下
    2013-07-07
  • SpringBoot获取maven打包时间的两种方式

    SpringBoot获取maven打包时间的两种方式

    这篇文章主要介绍了SpringBoot获取maven打包时间的两种方式,文章通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-05-05
  • java抽象类和接口定义与用法详解

    java抽象类和接口定义与用法详解

    这篇文章主要介绍了java抽象类和接口定义与用法,结合实例形式详细分析了java抽象类和接口的基本概念、原理、定义、使用方法及操作注意事项,需要的朋友可以参考下
    2020-02-02
  • Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析

    Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析

    这篇文章主要介绍了Java集合之Set、HashSet、LinkedHashSet和TreeSet深度解析,List是有序集合的根接口,Set是无序集合的根接口,无序也就意味着元素不重复,更严格地说,Set集合不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素,需要的朋友可以参考下
    2023-09-09
  • SpringBoot将项目打成war包步骤解析

    SpringBoot将项目打成war包步骤解析

    这篇文章主要介绍了SpringBoot将项目打成war包步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Android Studio中创建java工程的完整步骤

    Android Studio中创建java工程的完整步骤

    Android Studio创建java工程是非常麻烦的,因为Android Studio没有提供直接创建java工程的方法,下面这篇文章主要给大家介绍了关于Android Studio中创建java工程的完整步骤,需要的朋友可以参考下
    2024-01-01
  • java对象与json对象间的相互转换的方法

    java对象与json对象间的相互转换的方法

    本篇文章主要介绍了java对象与json对象间的相互转换的方法,详细介绍了json字符串和java对象相互转换,有兴趣的可以了解一下
    2017-01-01

最新评论