【问题标题】: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);