如何将两个每个 8 位的数组(二进制数字字符串组合成一个 16 位的单个字符串?(arduino,移位寄存器)
Posted
技术标签:
【中文标题】如何将两个每个 8 位的数组(二进制数字字符串组合成一个 16 位的单个字符串?(arduino,移位寄存器)【英文标题】:How do I combine two arrays of 8 bits each (binary number strings into one single string with 16 bits? (arduino, shift registers) 【发布时间】:2021-06-17 19:56:18 【问题描述】:在 Arduino 中,我试图将来自两个 PISO(并行输入 - 串行输出)移位寄存器的 8 位二进制数字/字符串组合成一个 16 位二进制字符串。使用 Arduino switchVar1 = shiftIn(dataPin, clockPin);
上的 shiftIn() 命令存储在变量 (switchVar1) 中的二进制数
switchVar1 最初由byte switchVar1 = 72;
定义。
我这样做是为了然后我可以使用 switch() 函数读取二进制字符串并进行不同的组合,因为我有 16 个触点/按钮,其中将定义所有 16 个按钮的不同组合,所以我需要一个 16 位的字符串二进制数。
基本上,我问的是如何将两个 8 位二进制数数组变成一个数组。
请记住,我对 c++ 完全陌生,所以可能有一些我可能没有想到的基本解决方案。
【问题讨论】:
类似unsigned char src[2]; unsigned int dst; dst = ((unsigned int)src[0] << 8) | src[1];
?
@MikeCAT 你不应该使用uint16_t
而不是 unsigned int 吗?
两个输入的类型是byte
,需要的输出类型是什么? std::uint16_t
?
@AndyG 我看到的唯一 UB 是 src[2]
是否未初始化。如果unsigned int
超过 16 位,uint16_t
会减少空间浪费。
@AndyG 我在这个 sn-p 中没有看到任何违反严格别名规则的行为。
【参考方案1】:
感谢大家的评论,它得到了解决。所以我只是这样做:
switchVar1 = shiftIn(dataPin, clockPin); switchVar2 = shiftIn(dataPin2, clockPin2); uint16_t switchVariable = switchVar1 | (switchVar2<<8);
正如我首先创建了两个字节文件并将一个 (switchVar2) 上的数字向左“移动”了 8 步(字面意思)(使用<<
位运算符)并将两者与位 OR 运算符(管道符号 |) 在一个 uint16_t
变量类型中。然后我只需使用switch() case
命令读取所有组合。
(另外,我对编程语言很陌生,说“数组”是我的错。)
【讨论】:
【参考方案2】:您应该查看按位运算和位掩码的工作原理。您会在这里找到一种方法。
Combining two uint8_t as uint16_t
【讨论】:
以上是关于如何将两个每个 8 位的数组(二进制数字字符串组合成一个 16 位的单个字符串?(arduino,移位寄存器)的主要内容,如果未能解决你的问题,请参考以下文章