大家好,我是网域小星球。

前面我们学习的运算,大多是面向日常逻辑的加减乘除、逻辑判断。而位运算是直接操作二进制比特位的运算,效率极高、占用内存极小,广泛用于:硬件开发、嵌入式、网络协议、权限标志、数据压缩、算法优化。

位段则可以精准控制变量占用比特位数,极致节省空间。本篇完整讲解 6 种位运算 + 位段用法,搭配实例、场景、经典算法,VS2022 直接运行。

目录

一、本章学习目标

二、二进制基础回顾

三、六大基础位运算

1. 按位与 &

2. 按位或 |

3. 按位异或 ^

4. 按位取反 ~

5. 左移 <<

6. 右移 >>

四、位运算完整示例(可直接运行)

五、位运算经典实用技巧

1. 不用临时变量交换两个整数

3. 指定位清零

4. 指定位置 1

六、位段(位域)精准内存控制

1. 什么是位段

2. 位段定义语法

注意事项

七、位运算 常见易错点

八、本章核心总结

下期预告

一、本章学习目标

  1. 掌握 6 大基础位运算:与、或、异或、取反、左移、右移
  2. 理解二进制底层逻辑,熟练位运算常用技巧
  3. 学会利用位运算:交换数字、判断奇偶、清零、置位、取反
  4. 掌握位段(位域)定义、使用与内存分配
  5. 了解位运算在项目、嵌入式、底层开发的实际应用

二、二进制基础回顾

计算机所有数据底层都是 二进制 0 和 1

  • 1 个比特位 = 1bit
  • 1 字节 = 8bit位运算,就是直接对每一个二进制位进行操作。

三、六大基础位运算

1. 按位与 &

规则:同一位置都为 1,结果才是 1,否则为 0用途:清零、保留指定位、判断奇偶

// 奇数二进制最后一位一定是1
if(n & 1)
{
    printf("奇数");
}

2. 按位或 |

规则:有 1 则 1,全 0 才 0用途:固定位置置 1、组合标志位

3. 按位异或 ^

规则:相同为 0,不同为 1经典特性:

  1. 任何数异或自身 = 0
  2. 任何数异或 0 = 本身用途:不使用临时变量交换两个数、简单加密

4. 按位取反 ~

规则:0 变 1,1 变 0注意:涉及补码运算,日常使用较少,多用于底层掩码

5. 左移 <<

a << n:整体二进制向左移动 n 位,右侧补 0等价快速运算:乘以 2 的 n 次方

6. 右移 >>

a >> n:整体二进制向右移动 n 位

  • 正数:左侧补 0等价快速运算:除以 2 的 n 次方(向下取整)

四、位运算完整示例(可直接运行)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
    int a = 5;   // 0101
    int b = 3;   // 0011

    printf("a & b = %d\n", a & b);  // 0001  1
    printf("a | b = %d\n", a | b);  // 0111  7
    printf("a ^ b = %d\n", a ^ b);  // 0110  6
    printf("a << 1 = %d\n", a << 1);// 1010  10
    printf("a >> 1 = %d\n", a >> 1);// 0010  2

    return 0;
}

五、位运算经典实用技巧

1. 不用临时变量交换两个整数

int x = 10, y = 20;
x = x ^ y;
y = x ^ y;
x = x ^ y;

2. 快速判断奇偶

if(x & 1)
    printf("奇数");
else
    printf("偶数");

3. 指定位清零

配合掩码 & 实现固定位清零

4. 指定位置 1

配合掩码 | 实现标志位开启


六、位段(位域)精准内存控制

1. 什么是位段

普通变量最小占用 1 字节(8bit)位段允许自定义成员占用多少个 bit,大幅节省内存。

适用场景:协议报文、硬件寄存器、状态标记、大量短状态存储

2. 位段定义语法

struct 结构体名
{
    类型 成员名 : 比特位数;
};

3. 基础示例

// 只用 3+4+1 位,极度节省空间
struct Flag
{
    unsigned int a : 3;  // 占3位
    unsigned int b : 4;  // 占4位
    unsigned int c : 1;  // 占1位
};

4. 位段使用

struct Flag f;
f.a = 5;
f.b = 10;
f.c = 1;

注意事项

  1. 位段不能取地址 &
  2. 跨编译器内存排布可能不同,不适合跨平台
  3. 位数不能超过当前类型最大比特数

七、位运算 常见易错点

  1. 混淆 逻辑与 &&按位与 &逻辑或 ||按位或 |
  2. 移位运算负数规则不同,开发中尽量只对正数移位
  3. 异或交换变量仅适用于整数,不能用于浮点数
  4. 位段跨平台兼容性差,项目通用数据尽量少用
  5. 忽略补码规则,误用按位取反~

八、本章核心总结

  1. 位运算直接操作二进制位,效率极高,底层开发必备
  2. & 清零判断、| 置位、^ 异或交换 / 加密、<< >> 快速乘除
  3. 异或三大特性:归零、不变、交换数据
  4. 位段可以按 bit 分配内存,适合硬件、协议、状态标记
  5. 位运算是算法、嵌入式、网络编程、驱动开发的基础技能

下期预告

整合全书所有知识点:数组、指针、结构体、动态内存、文件操作、菜单框架,做成功能完整、可直接上交作业 / 课程设计的成品项目。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐