当前位置: 首页 > news >正文

【算法】位运算看这一篇就够了:操作符、技巧与算法实战

目录

    • 位运算算法详解
      • 一、基础位运算操作符
      • 二、常用位运算技巧
        • 1. 判断奇偶性
        • 2. 交换两个数(不使用临时变量)
        • 3. 获取二进制中第k位
        • 4. 将第k位设置为1
        • 5. 将第k位设置为0
        • 6. 翻转第k位
        • 7. 统计二进制中1的个数
      • 三、常见位运算算法题
        • 1. 判断一个数是否是2的幂
        • 2. 找出只出现一次的数字(其他数字都出现两次)
        • 3. 找出两个只出现一次的数字
        • 4. 计算两个整数的和(不使用+和-)
        • 5. 子集枚举
      • 四、位运算的应用场景
      • 五、注意事项
      • 六、实战(含题目链接)

位运算算法详解

位运算是一种直接对整数在内存中的二进制位进行操作的低级运算,由于计算机底层就是二进制,位运算的效率非常高。

一、基础位运算操作符

操作符名称规则示例
&按位与两个位都是1时结果为15 & 3 = 1(0101 & 0011 = 0001)
|按位或至少有一个1时结果为15 | 3 = 7(0101 | 0011 = 0111)
^按位异或两个位不同时结果为15 ^ 3 = 6(0101 ^ 0011 = 0110)
~按位取反0变1,1变0~5 = -6(0101 -> 1010)
<<左移左移n位,右边补05 << 1 = 10(0101 -> 1010)
>>右移右移n位,正数左边补05 >> 1 = 2(0101 -> 0010)

二、常用位运算技巧

1. 判断奇偶性
// 常规方法boolisOdd(intn){returnn%2==1;}// 位运算方法:判断最低位boolisOdd(intn){returnn&1;// 如果最后一位是1,则是奇数}
2. 交换两个数(不使用临时变量)
voidswap(int&a,int&b){a=a^b;b=a^b;// b = (a^b)^b = aa=a^b;// a = (a^b)^a = b}
3. 获取二进制中第k位
intgetBit(intn,intk){return(n>>k)&1;// 右移k位后取最低位}
4. 将第k位设置为1
intsetBit(intn,intk){returnn|(1<<k);// 将1左移k位后按位或}
5. 将第k位设置为0
intclearBit(intn,intk){returnn&~(1<<k);// 将1左移k位后取反,再按位与}
6. 翻转第k位
inttoggleBit(intn,intk){returnn^(1<<k);// 异或1实现翻转}
7. 统计二进制中1的个数
// 方法1:逐位判断intcountOnes(intn){intcount=0;while(n){count+=n&1;n>>=1;}returncount;}// 方法2:Brian Kernighan算法(效率更高)intcountOnes(intn){intcount=0;while(n){n&=(n-1);// 消除最低位的1count++;}returncount;}

三、常见位运算算法题

1. 判断一个数是否是2的幂
boolisPowerOfTwo(intn){if(n<=0)returnfalse;return(n&(n-1))==0;// 2的幂只有一个1,消除后为0}
2. 找出只出现一次的数字(其他数字都出现两次)
intsingleNumber(vector<int>&nums){intresult=0;for(intnum:nums){result^=num;// 异或运算:相同为0,不同为1}returnresult;}
3. 找出两个只出现一次的数字
vector<int>singleNumber(vector<int>&nums){// 先对所有数异或,得到两个目标数的异或结果intxorResult=0;for(intnum:nums){xorResult^=num;}// 找到异或结果中最低位的1(用于分组)intmask=xorResult&(-xorResult);// 获取最低位的1// 根据该位分组异或inta=0,b=0;for(intnum:nums){if(num&mask){a^=num;}else{b^=num;}}return{a,b};}
4. 计算两个整数的和(不使用+和-)
intgetSum(inta,intb){while(b!=0){intcarry=(a&b)<<1;// 进位a=a^b;// 不进位加法b=carry;// 循环处理进位}returna;}
5. 子集枚举
vector<vector<int>>subsets(vector<int>&nums){vector<vector<int>>result;intn=nums.size();// 用二进制位表示每个元素选或不选for(intmask=0;mask<(1<<n);mask++){vector<int>subset;for(inti=0;i<n;i++){if(mask&(1<<i)){// 检查第i位是否为1subset.push_back(nums[i]);}}result.push_back(subset);}returnresult;}

四、位运算的应用场景

  1. 状态压缩:用整数的二进制位表示状态,节省空间
  2. 权限管理:用不同位表示不同权限
  3. 加密解密:异或运算常用于简单的加密
  4. 图形学:颜色值的RGB分量操作
  5. 性能优化:替代乘除法、取模等操作

五、注意事项

  1. 优先级问题:位运算符优先级低于比较运算符,使用时建议加括号
  2. 有符号数移位:右移对于负数,符号位处理取决于编译器
  3. 溢出风险:左移可能改变符号位或导致溢出
  4. 可读性:适当使用,必要时添加注释

位运算虽然看起来复杂,但掌握后能写出更高效的代码,特别是在算法竞赛和底层开发中非常有用。

六、实战(含题目链接)

判断字符是否唯⼀(easy)
丢失的数字(easy)
两整数之和(medium)
只出现⼀次的数字 II(medium)
面试题 17.19. 消失的两个数字(hard)

http://www.jsqmd.com/news/435617/

相关文章:

  • 2026年广东好用的美甲喷涂机怎么选,霞晖自动化优势凸显 - 工业品牌热点
  • 2026年哪家咨询公司更专业?中国精益生产咨询公司推荐与评价,直击落地难痛点 - 十大品牌推荐
  • 揭秘超高分子量聚乙烯板加工厂哪家强,航发塑业费用怎么收? - mypinpai
  • OpenClaw 创新应用:家庭情感守护者 —— 让AI成为你的情感哨兵
  • 选择盒马鲜生卡回收平台,这些注意事项不容忽视! - 团团收购物卡回收
  • Java小白求职大厂面试:从Spring Boot到微服务
  • 查询天气的代码
  • 2026年3月给排水管材厂家权威推荐,技术实力与市场口碑深度解析 - 品牌鉴赏师
  • 学长亲荐!更贴合MBA需求的降AIGC平台,千笔AI VS 灵感ai
  • 2026年3月轻重刚别墅龙骨厂家推荐,聚焦企业综合实力与核心竞争力 - 品牌鉴赏师
  • 2026年内修外细抗衰产品TOP5推荐:科技赋能下的精准抗衰新选择 - 深度智识库
  • 盘点2026年广东自动化喷涂设备,不错的喷涂设备工厂哪家好 - 工业品网
  • pcb多层板厂商测评 哪家工艺扎实品控可靠
  • 【人工智能】AI代理协议与规范技术编年史:从概念诞生到生态成熟
  • 1型糖尿病功能性治愈?30例停胰岛素!中国整合医学团队开创世界级临床成果
  • 下垂控制的两电平三相桥式逆变器:原理与MATLAB仿真实践
  • 好用的美甲喷涂机厂家推荐,霞晖自动化服务好不好? - 工业推荐榜
  • PCB十层板打样哪家好?实测猎板工艺扎实良率高
  • 复底不锈钢提锅口碑如何,不锈钢提锅服务商家怎么选择 - 工业设备
  • 2026年全国一件代发服务排名,海云汇等靠谱品牌推荐哪家? - 工业品牌热点
  • VASP教程:带隙的温度依赖性计算
  • 2026毕业论文生死局:如果你的AIGC查重率超过30%,请立刻停止盲目降重!
  • 超高分子量聚乙烯板厂推荐哪家,性价比高且口碑好的有吗 - mypinpai
  • 火锅新选择!2026年口碑好的火锅品牌有哪些?牛肉火锅/附近火锅/老火锅/火锅/社区火锅/美食,火锅品牌推荐排行 - 品牌推荐师
  • 论文救急!知网 AIGC 全线飘红?这款“洗稿神器”让我连夜上岸!
  • Kali GPT - 人工智能渗透测试助手Linux部署 - 实践
  • 探寻2026年高性价比美甲喷漆机制造商,霞晖自动化不容错过 - myqiye
  • 收藏 | 从Chatbot到智能体:小白也能看懂的大模型工程化学习指南
  • 2026年精益管理咨询公司推荐:针对数字化转型与工厂规划痛点的全面评测 - 十大品牌推荐
  • AGI学习笔记:从LLM到具身智能的演进路径,小白程序员必收藏!