C 语言从 0 入门(二十五)|位运算与位段:底层开发、嵌入式核心

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

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

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

目录

一、本章学习目标

二、二进制基础回顾

三、六大基础位运算

[1. 按位与 &](#1. 按位与 &)

[2. 按位或 |](#2. 按位或 |)

[3. 按位异或 ^](#3. 按位异或 ^)

[4. 按位取反 ~](#4. 按位取反 ~)

[5. 左移 <<](#5. 左移 <<)

[6. 右移 >>](#6. 右移 >>)

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

五、位运算经典实用技巧

[1. 不用临时变量交换两个整数](#1. 不用临时变量交换两个整数)

[3. 指定位清零](#3. 指定位清零)

[4. 指定位置 1](#4. 指定位置 1)

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

[1. 什么是位段](#1. 什么是位段)

[2. 位段定义语法](#2. 位段定义语法)

注意事项

[七、位运算 常见易错点](#七、位运算 常见易错点)

八、本章核心总结

下期预告

一、本章学习目标

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

二、二进制基础回顾

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

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

三、六大基础位运算

1. 按位与 &

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

cpp 复制代码
// 奇数二进制最后一位一定是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 次方(向下取整)

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

cpp 复制代码
#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. 不用临时变量交换两个整数

cpp 复制代码
int x = 10, y = 20;
x = x ^ y;
y = x ^ y;
x = x ^ y;
  1. 快速判断奇偶
cpp 复制代码
if(x & 1)
    printf("奇数");
else
    printf("偶数");

3. 指定位清零

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

4. 指定位置 1

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


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

1. 什么是位段

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

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

2. 位段定义语法

cpp 复制代码
struct 结构体名
{
    类型 成员名 : 比特位数;
};
  1. 基础示例
cpp 复制代码
// 只用 3+4+1 位,极度节省空间
struct Flag
{
    unsigned int a : 3;  // 占3位
    unsigned int b : 4;  // 占4位
    unsigned int c : 1;  // 占1位
};
  1. 位段使用
cpp 复制代码
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. 位运算是算法、嵌入式、网络编程、驱动开发的基础技能

下期预告

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

相关推荐
wuminyu2 小时前
专家视角看JVM_StartThread
java·linux·c语言·jvm·c++
Gofarlic_OMS2 小时前
ENOVIA基于Token的许可证消费模式分析与分点策略
java·大数据·开发语言·人工智能·制造
XY_墨莲伊2 小时前
【实战项目】基于B/S结构Flask+Folium技术的出租车轨迹可视化分析系统(文末含完整源代码)
开发语言·后端·python·算法·机器学习·flask
沐知全栈开发2 小时前
XML Schema 复合类型 - 混合内容
开发语言
Fleshy数模2 小时前
PyQt5 登录界面开发全流程:从环境配置到可视化设计
开发语言·python·qt
bingd012 小时前
慕课网、CSDN、菜鸟教程…2026 国内编程学习平台实测对比
java·开发语言·人工智能·python·学习
Hello--_--World2 小时前
Js 隐式类型转换、JavaScript `==` vs `===` 深度对比表
开发语言·javascript·ecmascript
liulilittle2 小时前
opencode 循环继续插件 /ralph-loop
开发语言
坐吃山猪2 小时前
Python29_并发编程
开发语言·网络·python·并发