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;
}
相关推荐
qq_172805592 小时前
基于Go的动态定时器管理功能架构方案设计与实现
开发语言·架构·golang
生命因何探索2 小时前
SpringBoot启动流程—面试热点
java·spring boot·面试
小乔的编程内容分享站2 小时前
C语言笔记之结构体第二篇
c语言·开发语言·笔记
xiaoye37082 小时前
如何在Spring中使用注解解决线程并发问题?
java·后端·spring
future02102 小时前
Spring IOC启动全流程解密
java·后端·spring·ioc
codeJinger2 小时前
【Python】集合
开发语言·python
太阳神LoveU2 小时前
Spring Boot 4.0.3和3.X的各个版本主要功能差别和优劣势对比
java·spring boot·后端
zhoupenghui1682 小时前
golang 锁实现原理与解析&锁机制(sync)种类与举例说明以及其使用场景
开发语言·后端·golang·mutex·wait·lock·sync
路弥行至2 小时前
linux运行脚本出现错误信息 /bin/bash^M: bad interpreter解决方法
linux·运维·开发语言·经验分享·笔记·其他·bash