如何设置字节变量中的位(Arduino)

时间:2014-02-19 20:15:29

标签: 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。

谢谢!

2 个答案:

答案 0 :(得分:2)

我建议使用比特结构的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

答案 1 :(得分:1)

怎么样:

char byte = (r1 << 4) | (r2 << 3) | (r3 << 2) | (r4 << 1) | r5;

或者相反:

char byte = r1 | (r2 << 1) | (r3 << 2) | (r4 << 3) | (r5 << 4);