C++基础知识点:位运算

一、位运算概念

计算机唯一识别的数据的二进制数据,计算机中所有数据都以二进制形式存储,即 0 和 1 两种状态。计算机对二进制数据进行的运算(算数运算、逻辑运算等)被称为位运算,即对二进制数的每一位进行操作的运算。

二、位运算符号

|----------|----------|---------------------------|
| 运算符 | 作用 | 说明 |
| & | 按位与 | 两个操作数同时为1,结果为1 |
| | | 按位或 | 两个操作数同时为0,结果为0 |
| ~ | 按位非 | 操作数为1,结果为0;操作数为0,结果为1 |
| ^ | 按位异或 | 两个操作数相同,结果为0;不相同结果为1 |
| << | 左移 | 右侧空位补0 |
| >> | 右移 | 左侧空位补符号位 |

按位与的用途:需要清零的位与0进行与操作;需要保留的某些位与1进行与操作。

按位或的用途:将置1的某些位与1进行或,需要保持的某些位与0进行或。

三、代码解析

cpp 复制代码
#include <iostream>
#include <iomanip>  // 仅用于格式化二进制输出,无额外子函数
using namespace std;

int main() {
    
    cout << "=== 基础位运算示例 ===" << endl;
    int a = 6;   // 二进制:00000110
    int b = 10;  // 二进制:00001010

    // 1. 按位与 &
    int andResult = a & b;  // 00000010 → 2
    cout << "a & b = " << andResult << "  ";
    for (int i = 7; i >= 0; i--) 
        cout << ((andResult >> i) & 1);
    cout << endl;

    // 2. 按位或 |
    int orResult = a | b;   // 00001110 → 14
    cout << "a | b = " << orResult << "  ";
    for (int i = 7; i >= 0; i--) 
        cout << ((orResult >> i) & 1);
    cout << endl;

    // 3. 按位异或 ^
    int xorResult = a ^ b;  // 00001100 → 12
    cout << "a ^ b = " << xorResult << "  ";
    for (int i = 7; i >= 0; i--) 
        cout << ((xorResult >> i) & 1);
    cout << endl;

    // 4. 按位取反 ~(仅显示低8位)
    int notResult = ~a;
    cout << "~a = " << notResult << "  ";
    for (int i = 7; i >= 0; i--) 
        cout << (((unsigned int)notResult & 0xFF) >> i & 1);
    cout << endl;

    // 5. 左移 <<
    int leftShift = a << 2; // 00011000 → 24
    cout << "a << 2 = " << leftShift << "  ";
    for (int i = 7; i >= 0; i--) 
        cout << ((leftShift >> i) & 1);
    cout << endl;

    // 6. 右移 >>
    int rightShift = b >> 1; // 00000101 → 5
    cout << "b >> 1 = " << rightShift << "  ";
    for (int i = 7; i >= 0; i--) 
        cout << ((rightShift >> i) & 1);
    
    cout << "\n=====================" << endl;

    // ===================== 第二部分:位运算实用技巧 =====================
 
    // 技巧1:判断奇偶
    int num1 = 15, num2 = 16;
    cout << num1 << " 是" << ((num1 & 1) ? "奇数" : "偶数") << endl;
    cout << num2 << " 是" << ((num2 & 1) ? "奇数" : "偶数") << endl;

    // 技巧2:交换两个数(无需临时变量)
    int x = 8, y = 12;
    cout << "\n交换前:x=" << x << ", y=" << y << endl;
    x = x ^ y;
    y = x ^ y;
    x = x ^ y;
    cout << "交换后:x=" << x << ", y=" << y << endl;

    // 技巧3:将某一位置1(第3位,从0计数)
    int val = 5; // 00000101
    int bitPos = 3;
    val |= (1 << bitPos); // 00001101 → 13
    cout << "\n将第" << bitPos << "位置1后:" << val << endl;

    // 技巧4:将某一位清零(第2位)
    val = 13; // 00001101
    bitPos = 2;
    val &= ~(1 << bitPos); // 00001001 → 9
    cout << "将第" << bitPos << "位清零后:" << val << endl;

    // 技巧5:判断某一位是否为1(第1位)
    val = 9; // 00001001
    bitPos = 1;
    bool is1 = (val & (1 << bitPos)) != 0;
    cout << "第" << bitPos << "位是" << (is1 ? "1" : "0") << endl;

    // 技巧6:快速计算2的n次方
    bitPos = 5;
    int pow2 = 1 << bitPos; // 32
    cout << "2^" << bitPos << " = " << pow2 << endl;

    
    return 0;
}
相关推荐
神仙别闹几秒前
基于C++ 实现 L 系统分形树
开发语言·c++
君顾11 分钟前
AI智能商城实战指南:从架构设计到部署落地的完整技术方案
java·开发语言·多商户
Rain的Java大神之路3 分钟前
SkyWalking从0-1部署成功实战
java·后端·架构
就叫飞六吧4 分钟前
Spring 动态注册与移除 Bean 科普
java·后端·spring
脉动数据行情17 分钟前
Python WebSocket 国内商品期货|螺纹钢 & 铁矿石实时行情监听
开发语言·python·websocket
IMPYLH8 分钟前
HTML 的 <legend> 元素
java·前端·html
运行时异常10 分钟前
WMS 仓储系统集成 AI Agent 实战】第 1 讲:从零搭建开发环境——pgvector 装不上、模型选错、依赖冲突,一天踩完三个大坑
java
夕除11 分钟前
redis--008
java·jvm·数据库
wear工程师15 分钟前
线程池队列满了会怎样?从拒绝策略看懂 ThreadPoolExecutor 的扩容顺序
java
晓晓_za89866815 分钟前
多租户 GEO 优化系统源码架构:权限隔离与数据分离实现
java·tcp/ip·spring·缓存·微服务·架构