我正在尝试找出一种方法来尽可能多地利用我的微 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/