将3个字节分成6个4位并重新组合为2个12位

时间:2013-11-20 11:08:21

标签: c

我试图想出一种方法将一个字节分成两个(例如。F8F8),以便稍后与其他字节重新组合。我读了点掩码,但我还是不太明白。这就是我想要做的事情。

F8 FF FF - 将字节分成两部分。我将使用变量来区分字节

u=Fv=8w=Fx=Fy=Fz=F,基本上是uv,{ {1}},wx

最终结果为yz或变量FF8 FFF xuv

有谁知道怎么做?提前谢谢!

2 个答案:

答案 0 :(得分:2)

如果变量x的值已知为一个字节,则可以将其分成两个nibble,如下所示:

x_lo = x & 0xf;
x_hi = (x >> 4) & 0xf;

要将两个nibble s y_loy_hi合并为一个字节,您可以移动和/或:

y = y_lo | (y_hi << 4);

答案 1 :(得分:1)

如果您对逻辑运算符不太熟悉,我建议引入两个小帮助函数来封装这些东西:

void split_nibbles( unsigned char ch, unsigned char *higherOrder, unsighed char *lowerOrder )
{
  *higherOrder = ch >> 4;
  *lowerOrder = ch & 0x0f;
}

 unsigned char merge_nibbles( unsigned char higherOrder, unsigned char lowerOrder )
 {
   return (higherOrder << 4) | (lowerOrder & 0x0f);
 }

然后你可以写

unsigned char bytes[] = { 0xf8, 0xff, 0xff };

unsigned char u, v, w, x, y, z;
split_nibbles( bytes[0], &u, &v );
split_nibbles( bytes[1], &w, &x );
split_nibbles( bytes[2], &y, &z );

bytes[0] = merge_nibbles( x, u );
bytes[1] = merge_nibbles( v, y );
bytes[2] = merge_nibbles( z, w );

...这与您的描述非常接近。 : - )