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

C++(9):位运算符进阶版

1. 变量定义

        变量 A = 45(二进制 0010 1101),B = 25(二进制 0001 1001):

int A = 45;  // 二进制: 0010 1101 (十进制45)
int B = 25;  // 二进制: 0001 1001 (十进制25)

2. 位运算符表

运算符名称规则实例结果(二进制)十进制结果
&按位与同1为1,否则为0A & B0000 10019
|按位或有1为1,全0为0A|B0011 110161
^按位异或不同为1,相同为0A ^ B0011 010052
~按位取反0变1,1变0(补码形式)~A1101 0010(8位简写)-46
<<左移左移指定位,右侧补0A << 21011 0100180
>>右移右移指定位,正数左侧补0,负数补1B >> 20000 01106

3. 代码实例与验证

#include <iostream>
#include <bitset> int main() {int A = 45;  // 0010 1101int B = 25;  // 0001 1001// 按位与 &std::cout << "A & B = " << (A & B) << " (二进制: " << std::bitset<8>(A & B) << ")\n";// 输出: A & B = 9 (二进制: 00001001)// 按位或 |std::cout << "A | B = " << (A | B) << " (二进制: " << std::bitset<8>(A | B) << ")\n";// 输出: A | B = 61 (二进制: 00111101)// 按位异或 ^std::cout << "A ^ B = " << (A ^ B) << " (二进制: " << std::bitset<8>(A ^ B) << ")\n";// 输出: A ^ B = 52 (二进制: 00110100)// 按位取反 ~(8位简写,实际为32位)std::cout << "~A = " << (~A) << " (二进制: " << std::bitset<8>(~A) << ")\n";// 输出: ~A = -46 (二进制: 11010010)// 左移 <<std::cout << "A << 2 = " << (A << 2) << " (二进制: " << std::bitset<8>(A << 2) << ")\n";// 输出: A << 2 = 180 (二进制: 10110100)// 右移 >>std::cout << "B >> 2 = " << (B >> 2) << " (二进制: " << std::bitset<8>(B >> 2) << ")\n";// 输出: B >> 2 = 6 (二进制: 00000110)return 0;
}

4. 关键规则说明

(1) 按位与 "&"

规则:仅当两位均为 1 时结果为 1

示例计算

0010 1101 (A=45)& 0001 1001 (B = 25) = 0000 1001 (十进制9)
(2) 按位或 "|"

规则:任一位为 `1` 则结果为 `1`。 - **示例计算**:

示例计算:

 0010 1101 (A=45) | 0001 1001 (B=25) = 0011 1101 (十进制61)
(3) 按位异或 "^"

规则:两位不同时结果为 `1`。 -

示例计算

0010 1101 (A=45) ^ 0001 1001 (B=25) = 0011 0100 (十进制52)
(4) 按位取反 "~"

规则:按位取反后结果为补码形式。

示例计算

A = 0010 1101
~A = 1101 0010 → 十进制为 -46(补码转换:符号位为1,数值位取反加1)
(5) 位移运算符

左移 `<<`

         左移 n 位 = 乘以 2^n(无溢出时),左侧溢出位丢弃,右侧补0。

45 << 2 = 45 * 4 = 180//0010 1101 → 左移2位 → 1011 0100,后面自动补0

右移 `>>`

          右移 n 位 = 除以 2^n,正数左侧补0,负数补1。

25 >> 2 = 25 / 4 = 6//0001 1001 → 右移2位 → 0000 0110

5. 实际应用场景

场景 1:标志位组合
const int FLAG_A = 1 << 0; // 0001 
const int FLAG_B = 1 << 1; // 0010 
int flags = FLAG_A | FLAG_B; // 0011(同时启用两个标志)
场景 2:快速乘除
int num = 30;
int doubled = num << 1; // 60(等价于 30*2)
int quarter = num >> 2; // 7(等价于 30/4,向下取整)
场景 3:权限校验
const int READ = 1;    // 0001
const int WRITE = 2;   // 0010
int userPermission = READ;if ((userPermission & WRITE) != 0) {std::cout << "用户有写权限";
} else {std::cout << "无写权限"; // 输出此结果
}

6. 注意事项

  1. 位数限制
    std::bitset<8> 仅显示8位,实际 int 类型为32或64位,负数需用补码完整表示。

  2. 符号位影响
    右移负数时结果依赖编译器实现(算术右移或逻辑右移)。

  3. 溢出风险
    左移可能导致溢出(如 A << 2 若为8位则结果为 10110100,但实际 int 类型会保留高位)。

http://www.xdnf.cn/news/5388.html

相关文章:

  • 变换炉设备设计:结构优化与工艺集成
  • 使用vue3-seamless-scroll实现列表自动滚动播放
  • 中空电机在安装垂直轴高速电机后无法动平衡的原因及解决方案
  • 26考研——中央处理器_指令流水线_流水线的冒险与处理 流水线的性能指标 高级流水线技术(5)
  • LintCode第4题-丑数 II
  • java笔记06
  • Three.js + React 实战系列 - 联系方式提交表单区域 Contact 组件✨(表单绑定 + 表单验证)
  • 频率学派和贝叶斯学派置信区间/可信区间的区别
  • spark算子介绍
  • 机器视觉开发教程——C#如何封装海康工业相机SDK调用OpenCV/YOLO/VisionPro/Halcon算法
  • 高精地图数据错误的侵权责任认定与应对之道
  • 【PVE】ProxmoxVE8虚拟机,存储管理(host磁盘扩容,qcow2/vmdk导入vm,vm磁盘导出与迁移等)
  • 数据库分库分表实战指南:从原理到落地
  • 1247. 后缀表达式
  • Compose笔记(二十二)--NavController
  • 数值运算的误差估计
  • DAMA车轮图
  • PyCharm软件下载和配置Python解释器
  • 【英语笔记(八)】介词和冠词的分析;内容涵盖介词构成、常用介词用法、介词短语;使用冠词表示不同的含义:不定冠词、定冠词、零冠词
  • 【Java项目脚手架系列】第六篇:Spring Boot + JPA项目脚手架
  • Git初始化相关配置
  • Vue 跨域解决方案及其原理剖析
  • springboot3+vue3融合项目实战-大事件文章管理系统-更新用户密码
  • 【AI提示词】免疫系统思维专家
  • 英语句型结构
  • ElasticSearch进阶
  • 【C/C++】const关键词及拓展
  • MIT 6.S081 2020 Lab3 page tables 个人全流程
  • 基于Java和高德开放平台的WebAPI集成实践-以搜索POI2.0为例
  • Typora自动对其脚注序号