C 如何在字节变量(Arduino)中设置位
我的问题是特定于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 如何在字节变量(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
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);
}