Java位运算符大全

1. Java 支持的位运算符

Java 提供了 7 种位运算符:

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

2. 位运算详解

(1) 按位与(&

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

  • 示例

    java 复制代码
    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。

  • 示例

    java 复制代码
    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。

  • 示例

    java 复制代码
    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 异或不变)。

  • 应用

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

      java 复制代码
      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)。

  • 示例

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

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

(5) 左移(<<

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

  • 示例

    java 复制代码
    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)。

  • 示例

    java 复制代码
    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(不考虑符号位)。

  • 示例

    java 复制代码
    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) 判断奇偶

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

(2) 交换两个数

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

(3) 计算绝对值

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

(4) 判断是否为 2 的幂

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

(5) 快速计算 2^n

java 复制代码
int power = 1 << n; // 2^n
System.out.println(power); // n=3 → 8

4. 总结

运算符 用途 示例
& 判断奇偶、权限控制 (n & 1) == 0
` ` 合并标志位
^ 交换变量、加密 a ^= b; b ^= a; a ^= b;
~ 取反 ~5 → -6
<< 快速乘以 2^n 5 << 2 → 20
>> 快速除以 2^n -5 >> 1 → -3
>>> 无符号右移 -5 >>> 1 → 2147483645
相关推荐
人道领域2 小时前
Day | 11 【苍穹外卖统计业务的实现:含详细思路分析】
java·数据库·后端·苍穹外卖
xiaoye37087 小时前
Java 自动装箱 / 拆箱 原理详解
java·开发语言
YDS8298 小时前
黑马点评 —— 分布式锁详解加源码剖析
java·spring boot·redis·分布式
ZTLJQ8 小时前
数据的基石:Python中关系型数据库完全解析
开发语言·数据库·python
夏霞8 小时前
c# signlar 客户端传递参数给服务端配置方法
开发语言·c#
迷藏4949 小时前
**发散创新:基于 Rust的开源权限管理系统设计与实战**在现代软件架构中,**权限控制**早已不
java·开发语言·rust·开源
升鲜宝供应链及收银系统源代码服务9 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
daidaidaiyu9 小时前
Nacos实例一则及其源码环境搭建
java·spring
2301_818419019 小时前
C++中的解释器模式变体
开发语言·c++·算法
小江的记录本9 小时前
【Redis】Redis全方位知识体系(附《Redis常用命令速查表(完整版)》)
java·数据库·redis·后端·python·spring·缓存