c - 从结构中读取/写入位

标签 c struct read-write

在 C 中,如果我们有一个结构定义为

struct PortBreg { 
unsigned int B0 :1; 
unsigned int B1 :1; 
unsigned int B2 :1; 
unsigned int B3 :1; 
unsigned int B4 :1; 
unsigned int B5 :1; 
unsigned int B6 :1; 
unsigned int B7 :1; 
};

#define Breg (*(volatile struct PortBreg *)(0x38)), 

如果我想从端口 B 的位 B3 读取值并将值写入端口 B 的位 B2,我可以这样做吗

int i=Breg.B3;      //to read
Breg.B2=i;          //to write ?

最佳答案

这可能取决于端口是否可读和可写,但对于普通变量,此代码有效:将 B3 复制到 B2。请与您的类型保持一致,int i 不是 unsigned int i。另请注意,我以通常的顺序打印每个成员,但实际端口读取的结构定义可能需要反转,因此 B7 是第一个。

#include <stdio.h>

struct PortBreg { 
    unsigned int B0 :1; 
    unsigned int B1 :1; 
    unsigned int B2 :1; 
    unsigned int B3 :1; 
    unsigned int B4 :1; 
    unsigned int B5 :1; 
    unsigned int B6 :1; 
    unsigned int B7 :1; 
};

void show(struct PortBreg Qreg)
// bit order MSB -> LSB
{
    printf("%u%u%u%u%u%u%u%u\n", 
       Qreg.B7, Qreg.B6, Qreg.B5, Qreg.B4, Qreg.B3, Qreg.B2, Qreg.B1, Qreg.B0);
}

int main(void)
{
    struct PortBreg Breg = {0, 0, 0, 1,};
    unsigned i;
    show(Breg);
    i = Breg.B3;
    Breg.B2 = i;
    show(Breg);
    return 0;
}

程序输出:

00001000
00001100

关于c - 从结构中读取/写入位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41249904/

相关文章:

java - 如何从 .java 文件中定义的方法调用中读取方法参数?

c++ - `--defsym` 链接器标志如何将值传递给源代码?

c - 生成 C 声明

c - C 中明显的 NULL 指针取消引用实际上是指针算术吗?

json - 当它是一个数组并且第一项与其余项的类型不同时,如何在 Swift 中解码 JSON?

linux - Bash 读/写文件描述符——寻找文件的开始

c - 使用 mmap 在 C 中共享内存中的结构

c - 如果使用 C 库,D 是否向后兼容 C?

c# - 从 C# : Of structs, 字符串和 wchar_t 数组调用 C++ dll 函数

Bash:在设备上写入然后从中读取