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++ 老炮儿的技术栈6 分钟前
分享一个安全的CString
c语言·c++·windows·git·安全·visual studio
桦044 分钟前
[C++复习]:STL
开发语言·c++
主宰者1 小时前
C# CommunityToolkit.Mvvm全局事件
java·前端·c#
计算机学姐1 小时前
基于SpringBoot的咖啡店管理系统【个性化推荐+数据可视化统计+配送信息】
java·vue.js·spring boot·后端·mysql·信息可视化·tomcat
前端小咸鱼一条1 小时前
16.迭代器 和 生成器
开发语言·前端·javascript
My的梦想已实现1 小时前
关于JAVA Springboot集成支付后打包JAR之后报安全错误的处理
java·spring boot·jar
小陈工1 小时前
2026年3月31日技术资讯洞察:AI智能体安全、异步编程突破与Python运行时演进
开发语言·jvm·数据库·人工智能·python·安全·oracle
ooseabiscuit2 小时前
SpringBoot3整合FastJSON2如何配置configureMessageConverters
java
苏宸啊2 小时前
rbtree封装map和set
c++
ok_hahaha2 小时前
java从头开始-黑马点评-Redission
java·开发语言