【问题标题】:How to set bits in a byte variable (Arduino)如何在字节变量中设置位(Arduino)
【发布时间】:2014-02-19 20:15:29
【问题描述】:

我的问题是 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。

谢谢!

【问题讨论】:

    标签: c math arduino byte shift


    【解决方案1】:

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

    【讨论】:

    • 最佳答案,但新人可能更难理解工会
    【解决方案2】:

    怎么样:

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

    或者反过来:

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

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2019-07-24
      • 2020-11-10
      • 1970-01-01
      • 2020-06-30
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多