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

C 如何在字节变量(Arduino)中设置位,c,math,arduino,byte,shift,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 谢谢 那么: char byte = (r1

我的问题是特定于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

谢谢

那么:

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

char byte=(r1我建议使用位结构的并集。它增加了清晰度并使其易于移植。您可以指定单个或任意大小的相邻位。同时快速重新排列它们

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);
}
您可以将此并集扩展为大于字节

注:uint8_t与字节相同


您甚至可以将联合扩展为一个字节数组,然后通过串行端口发送字节,或将它们作为一个长单词单独时钟输出,等等。请参阅更多。

最佳答案,但对于新手来说,联合可能更难理解
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);
}