我有2个4位数字(X0X1X2X3和Y0Y1Y2Y3),我想将它们组合在一起,这样我就可以创建一个8位数字:
X0X1X2X3
Y0Y1Y2Y3 => X0Y0X1Y1X2Y2X3Y3
我知道如何连接它们以创建X0X1X1X3Y0Y1Y2Y3
,但我仍然坚持如何在上面描述的模式中组合它们。
任何提示?
答案 0 :(得分:3)
交换四位数的一种非常快速的方法是使用查找表:
unsigned int spread[] = {
0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15,
0x40, 0x41, 0x44, 0x45, 0x50, 0x51, 0x54, 0x55
};
您可以使用spread[]
数组,其中“扩展”原始位,按如下方式构建输出:
unsigned int res = (spread[x] << 1) | spread[y];
诀窍在于构建查找表。选择其值使得索引的位与零交织。例如,0x07
或0111 2 ,变为0x15
或00010101 2 。
答案 1 :(得分:3)
这是执行此转换的一种相当直接的方式:
uint8_t result;
result |= (x & 8) << 4;
result |= (y & 8) << 3;
result |= (x & 4) << 3;
result |= (y & 4) << 2;
result |= (x & 2) << 2;
result |= (y & 2) << 1;
result |= (x & 1) << 1;
result |= (y & 1) << 0;
答案 2 :(得分:0)
您也可以在一行中完成此操作。
uint8_t result = (varX << 4) | (varY);