从 4 2 位创建一个字节(8 位)

标签 c algorithm binary spi dma

我正在尝试找出一种方法来尽可能多地利用我的微 Controller (32kb) 中的有限内存,并且正在寻求建议或指向执行我正在尝试做的事情的算法的建议。

一些背景知识:我直接从 DMA 向 SPI(串行外设接口(interface))发送曼彻斯特编码位。由于我可以将数据存储到 DMA 中的最小单位是一个字节(8 位),因此我必须将 1 表示为 0b11110000,将 0 表示为 0b00001111。这基本上意味着对于每一位信息,我都需要使用一个字节(8 位)的内存。这是非常低效的。

如果我可以减少它,以便我的 1 表示为 0b10,我的 0 表示为 0b01,我只需要为每 1 位内存使用 1/4 字节(2 位),这是适合我的解决方案。

现在,如果我可以按位保存到 DMA,这将不是问题,但我当然需要使用字节。所以我知道我的问题的解决方案涉及收集 8 位(或者在我的情况下是 4 个 2 位),然后作为一个字节存储到 DMA。

问题:

有解决这个问题的标准方法吗?

我怎样才能从 4 个 2 位数字的集合中创建一个 8 位数字?但我不想将这些数字相加,而是将它们收集在一起时的实际样子。

例如: 我有以下 4 个 2 位数字(请记住 0b10 代表 1,0b01 代表 0)(此外,这些存储的类型对解决方案开放,因为显然没有 2 位类型这样的东西)

1 号:0b01 2 号:0b10 3 号:0b10 4 号:0b01

我想从这些中创建以下 8 位数字:

8 位编号: 0b01 10 10 01 或不带空格 0b01101001 (0x69)

我在用c编程

最佳答案

好像可以打包四个数字a, b, c, d, 都是值为零或一,像这样:

64 * (a + 1) + 16 * (b + 1) + 4 * (c + 1) + (d + 1)

这是利用 x + 1 对您的两位整数进行编码:1 变为 0b10,0 变为 0b01。

关于从 4 2 位创建一个字节(8 位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21297000/

相关文章:

c - C语言中的信号量锁解决方案

C文本游戏段错误及调试

algorithm - 计算对象树中的最大重复子树

c - (char) 在 ((unsigned char) ~0 >> 1) 之前的作用是什么?

Java - 将 UTF-8 字符串转换为二进制的正确方法是什么?

c - 有效地计算两个数之和的模数

java - 了解 JNI 参数的安全访问

algorithm - 试图取消引用 `&` 指针

c++ - 如何在 C++ 中实现对函数的二分查找?

java - 在 Java 中将 char 作为字节处理,结果不同