xym-ee
  • 计算机与嵌入式开发学习
  • 1-1.编程基础
    • C 语言
      • C 中的数据
      • C 语言基础
      • 字符输入输出
      • 函数
      • 数组和指针
      • 字符串处理
      • 存储类别
      • 文件 I/O
      • 复杂数据类型
      • 位操作
      • 预处理和 C 库
    • 数据结构和算法入门
    • leetcode 刷算法题
      • 递归与栈
      • 二叉树与递归
      • 回溯问题
      • 动态规划 1
    • 基本工具和使用
      • shell
      • shell 脚本
      • vim 编辑器
      • 命令行数据整理
      • 命令行环境和配置
  • 1-2.计算机系统基础(CSAPP)
    • 1.计算机基础
    • 2.数据的表示
    • 3.加减运算
    • 4.乘除运算
    • 5.程序的表示转换和链接
    • 6.IA32指令
    • 7.过程调用
    • 10.程序的链接
  • 1-3.数字电路、计算机组成
    • 1.数字电路、virtual circuit board
    • 2.计算机组成/steam:Turing Complete
    • 3.微机原理与接口技术(8086)
  • 1-4.计算机网络
    • 1.从浏览器开始
    • 2.协议栈和网卡
    • 3.网络设备
    • 4.运营商、接入网
    • 5.服务器
    • 6.数据返回浏览器
    • socket编程
  • 1-5.操作系统
    • 0.绪论
      • 1.应用视角的操作系统
      • 2.硬件视角的操作系统
      • 3.数学视角的操作系统
      • 4.状态机模型的应用
    • 1.并发
      • 1.并发 bug 的解决思路
      • 2.互斥
      • 3.同步
      • 4.信号量
      • 5.真实并发
      • 6.调试技巧
      • 7.os kernel 实现
    • 2.虚拟化
      • 1.操作系统上的进程
      • 2.进程的地址空间
      • 3.系统调用和unix shell
      • 4.C 标准库的实现
      • 5.linux 操作系统
      • 6.可执行文件和加载
      • 7.动态链接和加载
      • 8.内核的实现
      • 9.fork 的应用
    • 3.持久化
      • 1.存储设备的原理
      • 2.输入输出设备模型
      • 3.设备驱动程序
      • 4.文件系统 API
      • 5.fat 和 unix 文件系统
      • 6.持久数据的可靠性
    • 总结
  • 2-1.嵌入式裸机开发
    • 嵌入式系统通信接口与协议
    • cortex-m 内核芯片裸机开发
    • MPU
  • 2-2.中等规模系统开发
    • LVGL 图形库
    • 裸机开发的软件框架
    • 基于 rtos 开发
  • 2-3.armv7-m架构与 rtos 原理
    • armv7-m 架构
    • rt-thread 内核实现
    • rt-thread 驱动开发
  • 3-1.linux 应用开发基础
  • 3-2.linux 镜像构建
    • uboot 使用
    • uboot 适配
    • uboot 启动分析
    • uboot 自定义命令
    • linux 内核适配
    • linux 内核启动分析
    • busybox 根文件系统构建
  • 3-3.linux 驱动开发
    • 驱动开发基础
    • sysfs
    • led 驱动
    • 设备树
    • pinctrl 和 gpio 子系统
    • 并发控制
由 GitBook 提供支持
在本页
  • 背景知识,二进制,bit byte
  • 按位运算符
  • 用法:掩码
  • 用法:打开位(设置位)
  • 用法:关闭位(清空位)
  • 用法:切换位
  • 用法:检查bit
  • 移位运算符
  • 位字段(位域) bit field

这有帮助吗?

  1. 1-1.编程基础
  2. C 语言

位操作

  • 运算符 ~ & | ^ << >> &= |= ^= <<= >>=

  • 回顾 二进制、八进制、十六进制计数法

  • 处理一个值中的位:位运算符和位字段

C 语言中可以单独操作变量中的 bit,在控制硬件设备时,通常每个 bit 都有特定的含义。与文件相关的操作系统信息在存储时也会通过 bit 表明特定项。许多压缩和加密操作都是直接处理 bit 的。

更高级的语言通常不会处理这个级别的细节,C 在比汇编高级的同时,保留了一些汇编级别的操作,因此 C 成为编写设备驱动和嵌入式代码的首选。

背景知识,二进制,bit byte

1 Byte = 8 bit

有符号整数,原码,反码和补码,

二进制浮点数,IEEE754

按位运算符

~ & | ^

用法:掩码

常用用法,掩码(mask),掩码指的是一些设置为开(1)或关(0)的 bit 组合。

#define MASK 2  //0b0000 0010
flags = flags & MASK;   //除 bit1 外都清除

相当于把 0 都覆盖上去,1 的位置保持原样。

用法:打开位(设置位)

打开一个 bit 同时其他 bit 保持不变

#define MASK 2          //0b0000 0010
flags = flags | MASK;   //bit1 置位
flags |= MASK;

用法:关闭位(清空位)

打开一个 bit 同时其他 bit 保持不变

#define MASK 2          //0b0000 0010
flags = flags & ~MASK;   //bit1 置位
flags &= ~MASK;

用法:切换位

打开已经关闭的,关闭已经打开的

#define MASK 0b1011 0110 
flags = flags ^ MASK;
flags ^= MASK;

用法:检查bit

#define MASK 2          //0b0000 0010

if ((flags & MASK) == MASK)
{

}

移位运算符

位字段(位域) bit field

struct field {
    unsigned char a : 1;
    unsigned char b : 1;
    unsigned char c : 1;
    unsigned char d : 1;
    unsigned char e : 1;
    unsigned char f : 1;
    unsigned char g : 1;
    unsigned char h : 1;
};

位字段提供了一种记录设置的方便的方式,有些设置是简单的二选一,只需要使用 1bit,包含位字段的结构允许在一个存储单元内保存多个设置。

struct prcode {
    unsigned char code1 : 2;
    unsigned char code1 : 2;
    unsigned char code1 : 8;
};

可以使用宽度为 0 的字段是下一字段域下一整数对齐。

关于字段的存储,和机器相关,因此不好移植,但是有些情况确实使用字段更方便。

上一页复杂数据类型下一页预处理和 C 库

最后更新于8个月前

这有帮助吗?