【位运算符】爆肝整理!C++位运算从入门到精通(面试必背),原反补+奇技淫巧,手撕算法题就靠它!

思科模拟器Cisco Packet Tracer交换机的管理配置 一、交换机的管理方式:带内管理和带外管理 通过交换机的 Console 端口管理交换机属于带外管理;这种管理方式不占用交换机的网络端口,第一次配置交换机必须利用 Console 端口进行配置。 通过 Telnet、拨号等方式属于带内管理。 二、控制台配置思科交换机 1.新建拓扑图 新建拓扑,选择console线连接交换机和PC,一端接交换机的console口,一端接PC的RS 232 口(... 阅读详情

C++ 位运算符全扩展技巧(面试必背)










一、基础位运算符回顾

原码,反码,补码

数值原码反码补码
+50000 01010000 0101(正数与原码相同)0000 0101(正数与原码相同)
-51000 0101(最高位1表示负,和+5同)1111 1010(符号位不变,其余位取反)1111 1011(反码 + 1)
00000 0000 或 1000 0000(存在+0和-0)0000 0000 或 1111 1111(同样两个0)0000 0000(唯一零,-0的补码也是0)





1. 对于正数和**+0**

  • 原码 = 反码 = 补码(符号位为0,数值位不变)。

内存中,数字以32位数存储

原反补的关系

原码:二进制数字,前面加上1(负数)或0(整数)

反码:原码除了表示正负号的第一位不变,其他都取反

补码:反码+1➡️内存中储存并使用的形式**(-1是全1)**

对于负数:补码和原码相互是取反加一的关系,当然,第一位代表符号,不看

  1. 有符号整型(signed int)
    1. 整数:原反补相同
    2. 负数:原反补都不同
  2. 无符号整型(unsigned int):都相同

6的原码,反码,补码:000000000000000000000110

3的原码,反码,补码:000000000000000000000011

-5的原码:100000000000000000000101

-5的反码:111111111111111111111010

-5的补码:111111111111111111111011




运算符名称运算规则例子(十进制)例子(二进制)
&按位与全 1 为 1,有 0 为 06 & 3 = 2110 & 011 = 010
``按位或有 1 为 1,全 0 为 0`6
^按位异或相同为 0,相异为 16 ^ 3 = 5110 ^ 011 = 101
~按位取反0 变 1,1 变 0~6 = -7补码表示
<<左移所有位左移 n 位,低位补 06 << 1 = 12110 << 1 = 1100
>>右移所有位右移 n 位,高位补符号位6 >> 1 = 3110 >> 1 = 011






二、⭐ 判断






1.判断奇偶

  • 判断最后一位是0是1
bool is_odd(int x) 
{
    return x & 1;
}





2. 判断 2 的幂

  • 判断一个数的二进制位是否只有一个1
bool is_power_of_two(int x) 
{
    return x > 0 && (x & (x - 1)) == 0;
}
  • 例子:8 & 7 = 0(是),6 & 5 = 4(不是)
  • 原理:2 的幂的二进制只有一个 1,减 1 后所有低位都变成 1,与运算结果为 0
  • 对应 LeetCode:231. 2 的幂





3. 判断 符号是否相同

  • 整体数字异或,只看结果的符号位:同0(正数)异1(负数)
bool same_sign(int x, int y) 
{
    return (x ^ y) >= 0;
}
  • 例子:3 ^ 5 = 6 >= 0(同号),3 ^ (-5) = -8 < 0(异号)





4. 判断第 n 位是否为 1(n 从 0 开始计数)

bool is_bit_set(int x, int n) 
{
    return (x >> n) & 1;
}






三、⭐ 修改

1. 置 1

int set_bit(int x, int n) {
    return x | (1 << n);
}
  • 例子:set_bit(4, 1) = 6(100 | 010 = 110)





2. 置 0

int clear_bit(int x, int n) 
{
    return x & ~(1 << n);
}
  • 例子:clear_bit(6, 1) = 4(110 & 101 = 100)





3. 翻转

  • 异或:同0异1
int toggle_bit(int x, int n) {
    return x ^ (1 << n);
}
  • 例子:toggle_bit(6, 0) = 7(110 ^ 001 = 111)





4. ‼️ 把最低位的 1置0

int clear_lowest_one(int x) 
{
    return x & (x - 1);
}
  • 例子:6 & 5 = 4(110 → 100,最低位的 1 被清零)

  • 核心用途:

    • 统计二进制中 1 的个数
    • 判断 2 的幂
    • 求最大公约数





5. 保留最低位的 1,其他位全部清零

// 注意:用long long避免INT_MIN溢出
long long get_lowest_one(long long x) 
{
    return x & (-x);
}



例子 1:正数 6(二进制 0110)

x = 6       → 0000 0110
(补码:~6 + 1 = 1111 1001 + 1 = 1111 1010)
(-x补码:  ~(-6) + 1 =  ~(1000 0110)+1    =   1111 1001 + 1           = 1111 1010)
-x = -6     → 1111 1010 
x & (-x)    → 0000 0010 = 2

✅ 结果是 2,正好是 6 最低位的 1(第 1 位)

x = 12      → 0000 1100
(-x补码:  ~(-12) + 1 =  ~(1000 1100)+1    =     1111 0011 + 1      = 1111 0100)
-x = -12    → 1111 0100
x & (-x)    → 0000 0100 = 4

✅ 结果是 4,正好是 12 最低位的 1(第 2 位)。




x = -6      → 1111 1010 
(-x补码:  就是6 )
-x = 6      → 0000 0110
x & (-x)    → 0000 0010 = 2

✅ 结果还是 2,和正数 6 一样,因为最低位的 1 的位置没变。

  • 例子:6 & (-6) = 2(110 → 010)





为什么必须用 long long?

(INT_MIN 的坑)

int的最小值是INT_MIN = -2147483648,它的二进制是1000 0000 ... 0000(只有最高位是 1)

x = INT_MIN → 1000 0000 ... 0000
-x = 2147483648 → 这个数超过了int的最大值(2147483647),溢出了!

溢出在 C++ 里是未定义行为,不同编译器结果不一样。用long long就不会有这个问题,因为 long long 的范围大得多。






6. ‼️交换两个整数

void swap(int& a, int& b) 
{
    a ^= b;
    b ^= a;//相当于b ^ a ^  b结果是 a
    a ^= b;//相当于a ^ a ^  b结果是 b
}






四、数学

1. 乘 2 的 n 次方

int multiply_by_power_of_two(int x, int n) 
{
    return x << n;
}
  • 例子:3 << 2 = 12(3 * 4 = 12)





2. 除以 2 的 n 次方(仅适用于正数)

int divide_by_power_of_two(int x, int n) 
{
    return x >> n;
}
  • 例子:12 >> 2 = 3(12 / 4 = 3)
  • 坑:负数右移是算术右移,结果和除法不同(-5 >> 1 = -3 而不是 -2)
-5的二进制:1111 1011
算术右移1位:1111 1101 = -3

而数学上 -5 / 2 = -2.5,向零取整是-2。

✅ 所以 -5 >> 1 = -3,不等于 -5 / 2 = -2。






3. 对 2 的 n 次方取模

x % (2^n)

int mod_power_of_two(int x, int n) 
{
    return x & ((1 << n) - 1);
}
  • 例子:10 % 4 = 2 → 10 & 3 = 2
  • 原理:2 的 n 次方减 1 的二进制是 n 个 1,与运算就相当于取后 n 位





4. 求整数的绝对值(不用 if 分支)

int abs(int x) 
{
    int mask = x >> 31;
    return (x ^ mask) - mask;
}
  • 原理:
    • 正数的 mask 是 0,结果还是 x;
    • 负数的 mask 是 - 1(全 1),
      • (x ^ mask)取反:x ^ (-1) 相当于按位取反
      • (x ^ mask) - mask;**加一:**减 - 1 相当于加 1,就是补码转原码






五、算法类技巧(面试高频)






1. 二进制中 1 的个数

用到了上面的‼️ 把最低位的 1置0

int count_ones(int x) 
{
    int count = 0;
    while (x) {
        x &= x - 1; // 每次清零最低位的1
        count++;
    }
    return count;
}
  • 时间复杂度:O (k),k 是 1 的个数,比循环 32 次快得多





2. 加法

int add(int a, int b) 
{
    while (b) 
    {
        int carry = (unsigned int)(a & b) << 1; // 计算进位
        a ^= b; // 无进位加法
        b = carry;
    }
    return a;
}
  • 原理:

    • 异或 ^ 做无进位加法
    • 与 & 左移 1 位做进位
    • 循环直到进位为 0





3. 缺失的数字

所有出现两次的数都会抵消,剩下的就是缺失的数

int missingNumber(vector<int>& nums) 
{
    int res = nums.size();
    for (int i = 0; i < nums.size(); i++) 
    {
        res ^= i ^ nums[i];
    }
    return res;
}





4. 只出现一次的数字系列

  • 一个数出现一次,其他出现两次:全部异或
  • 两个数出现一次,其他出现两次:先全部异或,再用最低位的 1 分组异或
  • 一个数出现一次,其他出现三次:统计每一位 1 的个数,模 3










七、重要注意事项(必看坑)

  1. 有符号数右移是算术右移:高位补符号位,负数右移结果和除法不同
  2. 左移溢出是未定义行为:不要左移超过类型的位数
  3. 1 << n 是 int 类型:需要 64 位时用 1LL << n
  4. x & (-x) 对 INT_MIN 有效:但结果是 INT_MIN 本身,必须用 long long 避免溢出






面试必背速查表

常用技巧核心公式主要用途
判断奇数x & 1所有需要判断奇偶的地方
清零最低位的 1x & (x - 1)统计 1 的个数、判断 2 的幂
保留最低位的 1x & (-x)分组、树状数组
统计 1 的个数Brian Kernighan 算法位运算基础题
不用临时变量交换异或三次面试经典题
不用加减乘除加法异或 + 与左移面试高频题

组合导航、惯导、GNSS、INS、IMU的区别 ‌:惯性导航系统(INS)是一种利用安装在运载体上的陀螺仪和加速度计来测定运载体位置的系统。它通过测量物体的加速度和角速度,结合算法计算出物体的位置、速度和姿态‌12。‌。 阅读详情

相关推荐

【UV打印机】PrintExp打印软件教程(六)-高级模式(马达)

输入高级模式密码进入高级模式高级模式界面有操作栏、控制栏、参数栏及参数界面操作栏名称功能说明文件加载数据从板卡加载参数保存将参数保存到主板退出退出高级模式固件导入固件导入配套版本下的固件配置*xpcfx导出固件导出当前使用的固件配置*xpcfx导入波形文件导入对应的波形文件*waf操作初始化系统继续初始化动作复位X轴复位回原点控制栏可进行小车运动、闪喷操作(此闪喷为点击进行闪喷,不受平台位置限制),无清洗功能。

Print World的专栏 3112

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 240

室内无人机自主定位:融合Mid360激光雷达与光流传感器的无GPS导航实践

本文详细介绍了室内无人机自主定位技术,通过融合Mid360激光雷达与光流传感器实现无GPS导航。文章分析了技术挑战、硬件配置、算法优化及实战调试,展示了在复杂室内环境中如何实现厘米级定位精度,为仓库巡检、隧道勘测等场景提供可靠解决方案。

weixin_30500105的博客 532

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 391

qemu-system-aarch64参数详解与实战配置指南

本文详细解析了qemu-system-aarch64的核心参数,包括-machine、cpu、smp、m、drive和netdev等关键配置。通过嵌入式内核调试、完整系统运行和外设模拟三大实战场景,提供可直接使用的配置示例与性能优化技巧,帮助开发者在x86主机上高效构建和调试ARM64虚拟环境。

weixin_29197051的博客 352

MuJoCo 仿真中的碰撞检测与参数优化实战

本文深入解析MuJoCo仿真中的碰撞检测机制与参数优化策略,涵盖位掩码配置、凸包分解实战及穿模问题解决方案。通过具体案例和参数设置建议,帮助开发者高效解决机械臂抖动、轴孔装配等常见问题,提升仿真精度与稳定性。特别针对步进电机仿真提供了高增益位置执行器的优化方案。

weixin_29081101的博客 333

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 338

【目标跟踪】多目标跟踪的评价工具motmetrics怎么使用?

多目标跟踪,通过motmetrics测试评价对应的视频。

聿默的博客 5368

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 70

【GlobalMapper精品教程】084:tif(tfw)、jpg(jgw)、png(pgw)的区别与联系

摘要:本文介绍了TFW、JGW、PGW等地理参考文件的基本原理和应用。这些文件通过简单的文本格式存储栅格图像的地理坐标信息,适用于平面坐标系下的GIS数据处理。文章详细说明了文件各行的含义,并提供了在ArcGIS和Globalmapper中生成这些文件的具体操作步骤,包括导出TIFF、JPG、PNG格式时勾选生成对应坐标文件的选项。这些文件虽然简单易用,但仅适用于平面坐标系,且功能相对有限。配套视频教程提供了更详细的操作演示。

智慧空间实验室 2402

Python 爬虫实战:豆瓣电影海报批量获取(Top250 榜单 + 可视化展示)

在信息爆炸的时代,数据已成为决策的核心,而数据的获取是数据分析的第一步。本文将详细介绍如何利用 Python 爬虫获取豆瓣电影 Top250 榜单的海报,并对数据进行可视化展示,助你更好地了解电影市场的趋势和用户的喜好。

yansideyucsdn的博客 718

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 347

《八》:玩家位置同步(玩家防碰撞)

在VR大空间体验中,由于玩家佩戴头显设备无法直接观察彼此位置,容易发生碰撞。因此,需要将玩家的实时位置信息绘制在虚拟空间中,实现位置可视化。通过获取头显的位置和旋转角度等数据,可以推算出玩家的移动状态和位置。使用可序列化的玩家结构体,通过UDP将玩家数据发送到服务器,服务器接收并反序列化数据后,同步所有玩家的最新信息至各客户端。客户端根据接收到的数据渲染虚拟人物模型,实现动态位置更新。这一过程涉及数据序列化、反序列化、网络通信和实时渲染等技术,确保玩家在虚拟空间中的位置同步和可视化。

unitygroup的博客 413

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 304

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 437

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 211

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C 语言 malloc() 详解与实战 Demo

本文详解C语言malloc()函数,涵盖其语法、内存原理及实战应用。通过动态整数、数组、结构体与链表的Demo,演示如何安全申请、使用与释放内存,强调避免内存泄漏与空指针检查的重要性,帮助开发者掌握动态内存管理核心技能。

tangPHP的博客 371

【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针

C++类与对象知识(面向过程和面向对象的初步认识,类的初步认识,类的访问限定符及封装,类的作用域、实例化,类的对象模型,this指针)

2601_96587588的博客 884

【C++ 基础入门】C++继承(下):问题、底层原理与组合

C++继承(菱形继承的问题、虚继承原理、继承与组合、构造顺序)

2601_96587588的博客 773

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 136

C++09_vector类复习

本文以10个核心问题为主线,系统解析C++ vector的底层机制:从基本概念、初始化方式、遍历方法,到size与capacity的区别、扩容策略(VS 1.5×,g++ 2×)、reserve与resize差异、中间增删的挪动原理、迭代器失效原因,直至二维vector的内存布局(含三指针结构)。通过“先会用、再懂扩容、最后看清对象结构”的递进逻辑,揭示vector作为动态数组的本质——连续内存、自动扩容、随机访问高效,但插入删除代价高,迭代器易失效。全文深入浅出,助读者摆脱“黑盒”认知,真正掌握其内存图景

lemo_n_的博客 337

825 mW 顶上 212 °C:ASM491S 的 105 °C/W、250 mA 短路电流与热关断

25 °C 环境里结温 34.1 °C,125 °C 环境里结温 134.1 °C——后者已经离 150 °C 只有 16 °C 了,但还在范围内。换个角度看同一件事:从 25 °C 和从 125 °C 起算,温升都是 86.6 °C,但一个到 111.6 °C(还在范围内),一个到 211.6 °C(远远超限)。这个算例里 20 °C/W 是我假设的,实际值取决于机壳材料、密封程度、有没有风扇,跨度可以从 5 °C/W 到 50 °C/W 以上。外面 50 °C 的机箱,盒内就是 63.9 °C。

ANSILIC的博客 339

《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试

本文系统完成了Gemini模型通过OpenAI兼容API的接入开发,基于Apifox验证接口规范,设计并实现GeminiProvider类,涵盖初始化、状态检测、全量响应等核心功能。重点处理了代理配置强制校验、Bearer鉴权、JSON序列化与响应解析等工程细节,并通过GTest与CMake完成单元测试,验证链路可用性。项目遵循策略模式,保持与DeepSeek、ChatGPT等模型的统一抽象接口,显著提升SDK可扩展性。

2501_91275995的博客 390

头歌 数据结构——C&C++线性表实训

本系列任务围绕线性表的链式实现,依次完成顺序构建、逆序构建、排序插入、查找、删除、求长度及栈、队列、集合等应用。通过动态内存分配与指针操作,掌握单链表的基本操作与实际应用,涵盖插入、删除、遍历、搜索等核心功能,最终实现数据结构在典型场景中的灵活运用。

一名敲代码的苦13程序员 238

C++ vector 添加与删除元素的底层原理:erase 返回值与倒序遍历删除

vector是连续内存的动态数组,支持O(1)随机访问,但扩容时需重新分配内存并搬迁元素。push_back和emplace_back均摊时间复杂度为O(1),扩容策略(如2倍或1.5倍)确保总代价均摊;insert与erase在中间位置操作需移动元素,时间复杂度O(n),且使后续迭代器失效。删除指定元素推荐使用erase-remove惯用法或std::erase_if,避免逐个删除导致O(n²)复杂度。从后往前遍历可防止漏删,但最优解仍是高效惯用法。预估容量后调用reserve()可避免频繁扩容,提升性能

2402_85743155的博客 794

字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)

本题核心思想是:最少移动步数 = 总长度 - 可保留的最长连续子串长度。未移动字母在T中必须为连续子串,在S中需保持相对顺序(即子序列)。通过枚举T的所有连续子串起点,贪心匹配S中的对应字符,求出最长可保留长度L,答案即为n−L。时间复杂度O(n²),空间复杂度O(n),适用于n≤1000。

冻柠茶飞冰走茶 586
上一篇: vector的基本使用 + 手搓成员变量 size capacity begin end operator[] reserve扩容 拷贝构造 赋值析构
下一篇: 【vector】爆肝 3 天!C++ vector 从入门到精通:标准库用法 + 手搓基础源码 + 面试高频坑全解
李诚俊coding
博客等级 码龄1年 166粉丝 67原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值