c - 如何在字节变量中设置位(Arduino)

标签 c math arduino byte shift

我的问题是针对 Arduino 的,尽管如果您知道如何用 C 语言来做,那么在 Arduino IDE 中也会类似。

所以我有 5 个整数变量:

r1, r2, r3, r4, r5

它们的值为 0(关闭)或 1(打开)。 我想将它们存储在一个字节变量中,让我们称之为中继,不是通过添加它们而是将某些位设置为 1/0,无论它们是 0 还是 1。 例如:

1, 1, 0, 0, 1

我想在我的继电器的字节变量中有完全相同的值,而不是 r1+r2+r3+r4+r5,在本例中为十进制 3,二进制 11。

谢谢!

最佳答案

我建议使用位结构的 UNION。它增加了清晰度并使其易于携带。您可以指定单个或任意大小的相邻位。以及快速重新排列它们。

union {
  uint8_t BAR;
  struct {
    uint8_t  r1 : 1; // bit position 0
    uint8_t  r2 : 2; // bit positions 1..2
    uint8_t  r3 : 3; // bit positions 3..5
    uint8_t  r4 : 2; // bit positions 6..7 
    // total # of bits just needs to add up to the uint8_t size
  } bar;
} foo;

void setup() {
  Serial.begin(9600);
  foo.bar.r1 = 1;
  foo.bar.r2 = 2;
  foo.bar.r3 = 2;
  foo.bar.r4 = 1;

  Serial.print(F("foo.bar.r1 = 0x"));
  Serial.println(foo.bar.r1, HEX);
  Serial.print(F("foo.bar.r2 = 0x"));
  Serial.println(foo.bar.r2, HEX);
  Serial.print(F("foo.bar.r3 = 0x"));
  Serial.println(foo.bar.r3, HEX);
  Serial.print(F("foo.bar.r4 = 0x"));
  Serial.println(foo.bar.r5, HEX);

  Serial.print(F("foo.BAR = 0x"));
  Serial.println(foo.BAR, HEX);
}

您可以在哪里将此 UNION 扩展为大于字节

注意 uint8_t 与 byte 相同。

您甚至可以将并集扩展为一个字节数组,然后通过串行端口发送字节或将它们作为一个长字逐个输出,等等...查看更多 extensive example .

关于c - 如何在字节变量中设置位(Arduino),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21891437/

相关文章:

html - HTML 中的获取方法

c - 如何检测我进程的终止?

math - 如何 "adjust"一个数据集,使总和等于 1。(我以为我知道正确的术语)

c - 主从配置中的 STM32 奇数定时器 1 行为 - mb 代码问题

c++ - 移动一组共面点的简单程序不起作用

javascript - JS-Math.atan(y/x) x==0

c++ - sscanf 错误 : cannot convert 'String' to 'const char*'

ubuntu - Arduino 内存清空

c - 嵌套结构 - 输入

在 C 中连接 char 数组