如何使用c将10位数据存储到8位阵列中?

如何使用c将10位数据存储到8位阵列中?,c,algorithm,C,Algorithm,我有一些数据如下: 0表示数据 x表示空 0000000000 xxxxxx 10位………6位浪费 我想用下一个数据压缩它以节省空间。 我使用位移动来实现这一点 |8位| 2位6位| 4位4位| 6位2位| 8位| 到目前为止,我已经: #define mask1 (char)((Data & 0xFF00) >> 8); //apply mask #define mask2 (char)((Data & 0x00C0) >> 6); #defi

我有一些数据如下:
0表示数据
x表示空
0000000000 xxxxxx
10位………6位浪费

我想用下一个数据压缩它以节省空间。

我使用位移动来实现这一点

|8位| 2位6位| 4位4位| 6位2位| 8位|

到目前为止,我已经:

#define mask1   (char)((Data & 0xFF00) >> 8);  //apply mask
#define mask2   (char)((Data & 0x00C0) >> 6);
#define mask3   (char)((Data & 0xFC00) >> 10); 
#define mask4   (char)((Data & 0x03C0) >> 6);
#define mask5   (char)((Data & 0xF000) >> 12); 
#define mask6   (char)((Data & 0x0FC0) >> 6);
#define mask7   (char)((Data & 0xC000) >> 14); 
#define mask8   (char)((Data & 0x3FC0) >> 6);

switch (counter) {     //repeat after 4 times
    case 0:
         array[i++] = mask1;
         array[i]   = mask2;
         counter++;
         break; 

    case 1:
         array[i++]| = (mask3);
         array[i]    = (mask4);
         counter++;
         break;

    case 2:
         array[i++]| = mask5;
         array[i]    = mask6;
         counter++;
         break; 

    case 3:
         array[i++]| = mask7;
         array[i++]  = mask8;
         counter=0;
         break;
}

一个可行的方法是投射数组,并移动数组指针。 如果我画出这样的图,会更好地解释:

oooooooooo_____
        __oooooooooo____
                ____oooooooooo__
                        ______oooooooooo
                             >>>|<<<
                                        oooooooooo______

oooooo_____
__呜呜呜呜____
____呜呜呜呜__
______呜呜呜呜

>>>|提示:一次做5个字节(4 x 10位值)。@Paul R-好建议,我会尝试这样做。你真的需要节省空间吗?这可能会使事情变得更加复杂。@Len我需要性能,代码将在微控制器中运行,数据将保存在闪存中。我正试图节省更多的空间,也许是一些内存访问时间。@pstan:不错,但我会先进行基准测试,看看你真正能从哪里获得最多。
void convert(char* array, int arraySz, tenbitData* Data, int dataSz)
{
    char* arrPtr = array;
    int dataIdx = 0;
    int rollCnt = 0;

    for (int i = 0; i < dataSz; i++)
    {
        ushort dat = dataSz[i] << 6 - ((i % 4) * 2);
        ushort* ariPtr = (ushort*) arrPtr;
        ariPtr[0] |= dat;
        arrPtr += ((i % 4) == 3 ? 2 : 1;
    }
}