将包含12位数字的16位数组转换为8位连续数组

时间:2017-07-14 22:58:00

标签: c arrays bit-manipulation

我的数据是12位,存储在16位值的数组中。他们只是价值< 4095。

我需要以8位块输出12位数据;顶行是输入值的12位,底行是输出值的8位。

11|10|09|08|07|06|05|04|03|02|01|00|11|10|09|08|07|06|05|04|03|02|01|00
07|06|05|04|03|02|01|00|07|06|05|04|03|02|01|00|07|06|05|04|03|02|01|00

所以对于输出数组: 第一个字节包含第一个12位值的前8位。 第二个字节包含第一个12位值的最后4位和第二个12位值的前4位。 第三个字节包含第二个值的最后8位。 等等...

理想情况下,我想将存储在16位数组中的12位数字数组转换为8位数组,其中值是连续的。

从技术上讲,它不必作为8位数组出来,当我逐步执行16位数组时,我可以通过函数SPI.Transfer(byte)输出8位值。

2 个答案:

答案 0 :(得分:0)

您需要首先指定字节顺序和术语。首先来自MSBit还是LSBit?无论如何,在商业中会有很多转移 ing,。您的结果数据将采用源格式,字节顺序和第一个/最后一个观点。

假设前8位从最高有效位开始:

for(i = 0; i < Lenght_of_16_Bit_Array; i++)
{
  if(i % 2 == 0)
    i8 = a16[i] >> 4; // takes first 8-bit and chops least 4-bits
  else
    i8 = a16[i-1] << 4 | a16[i] >> 8 // takes least 4-bits of prior item and chops 8-bits of current item.

  a8[i] = i8;
}

// last control if your initial length is an odd number(means the index is even)
if(Lenght_of_16_Bit_Array % 2 = 1)
  a8[Lenght_of_16_Bit_Array] = a16[Lenght_of_16_Bit_Array - 1] & 0xF; //recover that last 4 bits

答案 1 :(得分:0)

这样可行;也许有更优雅的方式?

    byteCount = 0;
    for (int i = 0; i < numberOf16bitItems; i++) {
        if (i % 2) {
          //if odd then just grab the last 8 bits
          toArray[byteCount] = fromArray[i] & 0b11111111;
          byteCount++;
        } else {
           // if even get the first 8 bits and output, plus get the last 4 bits and the next bits of the next item
           toArray[byteCount] = (fromArray[i] >> 4) & 0b11111111;
           byteCount++;
           toArray[byteCount] = ((fromArray[i+1] >> 8) & 0b1111) | (fromArray[i] & 0b1111 << 4);
           byteCount++;
        }
      }