news 2026/5/9 23:35:53

按位运算符

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
按位运算符

按位运算符直接操作二进制位,是编程中处理位级操作、性能优化、状态标记的核心工具。以下是Java / 通用编程语言中按位运算符的完整规律,包含核心定义、常用技巧和边界场景。


一、核心按位运算符(7 个)

运算符名称符号运算规则(以 a=6 (0110)、b=3 (0011) 为例)结果(二进制)结果(十进制)
&按位与AND对应位都为 1 则为 1,否则为 000102
|按位或OR对应位有 1 则为 1,否则为 001117
^按位异或XOR对应位不同则为 1,相同则为 001015
~按位取反NOT每一位取反(1→0,0→1,含符号位)11111111 11111001(补码)-7(Java int)
<<左移SHL左移 n 位,低位补 0,高位溢出舍弃6<<1=110012
>>右移(算术)SHR右移 n 位,高位补符号位(正数补 0,负数补 1)6>>1=00113
>>>右移(逻辑)USHR右移 n 位,高位补 0(仅无符号右移,Java 特有)-6>>>1=21474836452147483645

基础规则补充

  1. 按位与(&)
    • 任何数 & 0 = 0;任何数 & 自身 = 自身;
    • 常用:判断奇偶(num & 1 == 0为偶数)、提取指定位(num & (1<<k)判断第 k 位是否为 1)。
  2. 按位或(|)
    • 任何数 | 0 = 自身;任何数 | 全 1 = 全 1;
    • 常用:置 1 指定位(num | (1<<k)将第 k 位设为 1)。
  3. 按位异或(^)
    • 任何数 ^ 0 = 自身;任何数 ^ 自身 = 0;满足交换律 / 结合律(a^b^a = b);
    • 常用:交换两个数(a=a^b; b=a^b; a=a^b)、找唯一出现奇数次的数。
  4. 按位取反(~)
    • 补码规则:~num = -num - 1(如~6 = -7~-3 = 2);
    • 注意:Java 中 int 是 32 位,取反会包含符号位,无单独 “无符号取反”。
  5. 移位运算
    • 左移(<<):等价于乘以 2n(无溢出时),如num << 3 = num * 8
    • 算术右移(>>):等价于除以 2n 向下取整(如7>>1=3-7>>1=-4);
    • 逻辑右移(>>>):仅对正数和 >> 一致,负数右移后变为正数(因为高位补 0)。

二、按位运算核心规律

1. 位运算与数值运算的等价性(无溢出)

位运算表达式等价数值运算适用场景
num << nnum * (2^n)快速乘法(性能优于 *)
num >> nnum / (2^n)(向下取整)快速除法
num & (num-1)清除 num 最右侧的 1统计 1 的个数、判断 2 的幂
num & (-num)提取 num 最右侧的 1树状数组(BIT)核心
a ^ b ^ ba还原原值

2. 常用位运算技巧(高频)

(1)判断是否为 2 的幂

原理:2 的幂的二进制只有 1 个 1,num & (num-1) == 0(需排除 num=0)。

java

运行

boolean isPowerOf2(int num) { return num > 0 && (num & (num - 1)) == 0; }
(2)统计二进制中 1 的个数

方法 1:逐位判断(通用)

java

运行

int countOne(int num) { int count = 0; while (num != 0) { count += num & 1; // 取最低位 num = num >>> 1; // 无符号右移(避免负数死循环) } return count; }

方法 2:快速消去最右侧 1(效率更高)

java

运行

int countOne(int num) { int count = 0; while (num != 0) { num &= num - 1; // 消去最右侧的1 count++; } return count; }
(3)交换两个数(无需临时变量)

原理:异或的自反性(a^b^b = a)。

java

运行

void swap(int[] arr, int i, int j) { if (i == j) return; arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; // 等价于原arr[i] arr[i] = arr[i] ^ arr[j]; // 等价于原arr[j] }
(4)将第 k 位设为 0/1
  • 设为 0:num & ~(1 << k)(先构造第 k 位为 0、其余为 1 的掩码,再与运算);
  • 设为 1:num | (1 << k)(构造第 k 位为 1 的掩码,或运算);

java

运行

// 第k位设为0(k从0开始,最低位为0) int setBit0(int num, int k) { return num & ~(1 << k); } // 第k位设为1 int setBit1(int num, int k) { return num | (1 << k); }
(5)两个数的加减(不用 +/-)

原理:异或算无进位和,与运算算进位,循环直到进位为 0。

java

运行

// 加法:a + b int add(int a, int b) { while (b != 0) { int carry = (a & b) << 1; // 进位(只有1&1才产生进位) a = a ^ b; // 无进位和 b = carry; // 进位赋值给b,循环直到无进位 } return a; } // 减法:a - b = a + (-b),-b = ~b + 1 int sub(int a, int b) { return add(a, add(~b, 1)); }

三、边界与易错点

  1. 溢出问题
    • 左移可能溢出(如Integer.MAX_VALUE << 1变为负数),移位运算不做溢出检查;
    • 示例:1 << 31(int 范围是 - 2^31 ~ 2^31-1),结果为-2147483648(溢出为负数)。
  2. 负数的位运算
    • 所有位运算基于补码,负数的最高位是 1,算术右移会补 1(如-1 >> 100 = -1);
    • 逻辑右移(>>>)对负数会将符号位变为 0,如-1 >>> 1 = 2147483647(int 最大值)。
  3. 优先级问题
    • 位运算优先级低于算术运算,高于赋值运算;
    • 错误示例:num & 1 == 0等价于num & (1 == 0)(错误),需加括号:(num & 1) == 0
  4. 0 和 1 的特殊处理
    • ~0 = -1(所有位为 1),~1 = -2
    • 0 ^ num = num1 & num = num & 1(取最低位)。

四、应用场景总结

场景核心位运算
状态标记(如权限)按位或(置 1)、按位与(判断)
数值快速运算(乘除 2^n)移位运算
数组去重 / 找唯一数按位异或
二进制位操作(统计 1、置位)&、、^、~
算法优化(如快速排序、树状数组)&(lowbit)
加密 / 哈希算法异或、移位组合

按位运算的核心优势是性能极高(直接操作硬件层二进制),在底层编程、算法竞赛、高性能框架中广泛使用,掌握上述规律可大幅简化位级逻辑的实现。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 12:54:58

Flutter Provider 状态管理深度解析与开源鸿蒙 ArkUI 状态管理对比

文章目录Flutter Provider 状态管理深度解析与开源鸿蒙 ArkUI 状态管理对比引言一、Flutter Provider 核心原理1.1 什么是 Provider1.2 Provider 核心组件1.3 Provider 工作流程二、Flutter Provider 实战教程2.1 环境准备2.2 案例&#xff1a;实现一个计数器应用步骤1&#xf…

作者头像 李华
网站建设 2026/5/9 1:23:15

Vue.js 前端框架开发知识点总结

前言Vue.js 作为目前最流行的前端框架之一&#xff0c;以其简洁的 API、灵活的组件化和优秀的性能获得了广大开发者的青睐。本文将系统总结 Vue.js 的核心知识点&#xff0c;帮助开发者更好地掌握这一框架。一、Vue.js 核心概念1.1 响应式原理Vue.js 的响应式系统是其核心特性&…

作者头像 李华
网站建设 2026/5/9 0:50:59

行测教程资源合集

归墟行测 文件大小: 9.9GB内容特色: 9.9GB行测全套题库视频精讲&#xff0c;夸克秒下适用人群: 国考、省考、事业单位备考者核心价值: 刷题模考解析一站式&#xff0c;提分快下载链接: https://pan.quark.cn/s/201aaf99d2e4 半月谈付费行测申论资料 文件大小: 57.6GB内容特色…

作者头像 李华
网站建设 2026/5/9 0:51:02

基于java的SpringBoot/SSM+Vue+uniapp的零工市场服务系统的详细设计和实现(源码+lw+部署文档+讲解等)

文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言 &#x1f31e;博主介绍&#xff1a;✌全网粉丝15W,CSDN特邀作者、211毕业、高级全…

作者头像 李华
网站建设 2026/5/9 0:51:12

C#如何实现大文件上传的日志记录?

大文件传输系统建设方案&#xff08;ASP.NET技术栈&#xff09; 一、项目背景与核心需求 作为公司项目负责人&#xff0c;针对产品部门提出的100G级大文件传输需求&#xff0c;需构建一套高兼容性、高稳定性、全浏览器支持的解决方案。核心需求如下&#xff1a; 功能需求&…

作者头像 李华