news 2026/7/7 9:22:47

C++基础知识点——5个重要位运算技巧(通俗易懂版)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++基础知识点——5个重要位运算技巧(通俗易懂版)

前言:“1在内存中不是孤零零的1,而是前面有很多0的二进制串,具体多少个0由变量类型决定——int有31个0,long long有63个0。1的二进制:00000000,00000000,00000000,00000001”

5个位运算技巧(通俗易懂版)

技巧1:判断奇偶性 ⚖️

公式:x & 1

一句话:看最后一位是0还是1

怎么理解?

二进制就像一排灯泡(0灭1亮):

奇数的最后一位总是1: 1(1), 3(11), 5(101), 7(111) 偶数的最后一位总是0: 2(10), 4(100), 6(110), 8(1000)

代码:

if (x & 1) { cout << "奇数"; // 最后一位是1 } else { cout << "偶数"; // 最后一位是0 }

技巧2:获取二进制的某一位 🔍

公式:(x >> i) & 1

一句话:把想要的位移到最右边,然后看是0还是1

怎么理解?

比如想知道数字13(1101)的第2位:

13的二进制: 1 1 0 1 第3 第2 第1 第0位 我们要第2位:把数字右移2位 → 11(01)变成 0011 然后看最右边一位:1

代码:

int getBit(int x, int i) { return (x >> i) & 1; // 返回第i位(0或1) } // 例子:getBit(13, 2) = 1

技巧3:修改二进制的某一位 ✏️

设为1:x | (1 << i)

一句话:用一个"只有第i位是1"的数去"或"

设为0:x & ~(1 << i)

一句话:用一个"只有第i位是0"的数去"与"

怎么理解?

设为1(或运算):

x = 9(1001),想把第1位变成1 1 << 1 = 0010(只有第1位是1) 1001 | 0010 = 1011(成功!)

设为0(与运算):

x = 11(1011),想把第1位变成0 1 << 1 = 0010 ~(0010) = 1101(只有第1位是0) 1011 & 1101 = 1001(成功!)

代码:

int setBitToOne(int x, int i) { return x | (1 << i); } int setBitToZero(int x, int i) { return x & ~(1 << i); }

技巧4:判断是否为2的幂次方 ⚡

公式:(x & (x-1)) == 0

一句话:2的幂就像"1000..."(只有一个1),减1变成"0111...",一与就没了

怎么理解?

2的幂的二进制:

2^0 = 1 = 0001 2^1 = 2 = 0010 2^2 = 4 = 0100 2^3 = 8 = 1000 特点:只有一个1!

减1后:

8(1000) - 1 = 7(0111) 1000 & 0111 = 0000 ✓ 不是2的幂: 6(0110) - 1 = 5(0101) 0110 & 0101 = 0100 ≠ 0 ✗

代码

bool isPowerOfTwo(int x) { return x > 0 && (x & (x-1)) == 0; }

技巧5:获取最低位的1(lowbit)🎯

公式:x & -x

一句话:找到二进制中最右边的那个1,其他全变0

怎么理解?

x = 12(二进制1100) 最右边的1在第2位(从0开始数) -x = -12(补码表示:0100,其实是...11110100) 1100 & ...11110100 = 0100(4) 结果:0100,就是最右边那个1!

有什么用?

  • 树状数组的核心操作

  • 快速找"最右边"的1

  • 统计1的个数时可以用

代码:

int lowbit(int x) { return x & -x; } // lowbit(12) = 4 // lowbit(10) = 2(10=1010,最低位1是0010=2)

🎓 五个技巧总结

技巧公式作用记忆方法
判断奇偶x & 1看最后一位"末位1=奇数"
获取某位(x>>i) & 1看第i位"右移再看末位"
修改某位x|(1<<i)x&~(1<<i)改0或1"造面具戴面具"
2的幂判断(x&(x-1))==0判断是否只有1个1"只有一个1的消掉就没了"
最低位1x & -x找最右边的1"负数取反加1,正好对齐"

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

EmotiVoice语音合成系统灰度问题追踪与闭环管理

EmotiVoice语音合成系统灰度问题追踪与闭环管理 在虚拟主播深夜直播中突然“变脸”成另一个人的声音&#xff0c;或客服机器人面对用户愤怒投诉时仍用欢快语调回应——这些看似荒诞的场景&#xff0c;恰恰揭示了当前AI语音交互系统的深层痛点&#xff1a;缺乏情感理解、音色失控…

作者头像 李华
网站建设 2026/7/7 10:18:32

一文拆解格力GMV9智岳能效革命底气:全链自研构筑能效护城河

2025年4月&#xff0c;上海新国际博览中心的中国制冷展现场&#xff0c;一台标注着“APF6.45”的多联机空调前围满了全球制冷行业的从业者。这台名为格力GMV9智岳的产品&#xff0c;不仅拿下了本届制冷展金奖&#xff0c;更以远超行业现有水平的能效数据&#xff0c;将多联机行…

作者头像 李华
网站建设 2026/7/7 16:39:49

3步打造惊艳数据报告:告别枯燥表格的终极指南

你是否曾经面对密密麻麻的数据表格感到头疼&#xff1f;花费大量时间整理数据&#xff0c;却发现最终呈现的效果依然难以让人眼前一亮&#xff1f;今天&#xff0c;我们将一起探索如何通过数据可视化工具&#xff0c;让枯燥的数字变成引人入胜的数据故事。&#x1f680; 【免费…

作者头像 李华
网站建设 2026/7/6 19:51:54

直播场景中的语音创新:用EmotiVoice生成实时互动语音

直播场景中的语音创新&#xff1a;用EmotiVoice生成实时互动语音 在如今的直播生态中&#xff0c;观众早已不满足于“看”一场表演。他们渴望互动、期待回应&#xff0c;甚至希望感受到主播情绪的真实波动。然而&#xff0c;即便是人气主播&#xff0c;也难以做到对每一条弹幕都…

作者头像 李华
网站建设 2026/7/7 11:46:51

winform 窗口随鼠标移动

protected override void WndProc(ref Message m) {switch (m.Msg){case 0x0201://鼠标左键按下的消息m.Msg 0x00A1;//更改消息为非客户区按下鼠标m.LParam IntPtr.Zero;//默认值m.WParam new IntPtr(2);//鼠标放在标题栏内break;}base.WndProc(ref m); }直接放在form类中就…

作者头像 李华
网站建设 2026/7/7 5:19:49

M1/M2 Mac上高效部署Vivado的完整解决方案

M1/M2 Mac上高效部署Vivado的完整解决方案 【免费下载链接】vivado-on-silicon-mac Installs Vivado on M1/M2 macs 项目地址: https://gitcode.com/gh_mirrors/vi/vivado-on-silicon-mac 在Apple Silicon芯片&#xff08;M1/M2&#xff09;的Mac上进行FPGA开发一直面临…

作者头像 李华