如何将两个每个 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,移位寄存器)的主要内容,如果未能解决你的问题,请参考以下文章

如何将数组转化为字符串,编程怎么实现呢

20.高精度的压位

C++有一串01字符序列,如何把它们转化为对应的二进制位的形式写入文件

文字编码总结

数字逻辑8421BCD码换成十进制和二进制数

数组中只出现一次的数字