将2个十六进制值组合成1个十六进制值

时间:2016-04-05 09:25:55

标签: c++ hex bit-manipulation byte

我有一对坐标值,每个值的范围为[0,15]。现在我可以使用无符号,但是由于16 x 16 = 256个可能的坐标位置,这也表示1字节的所有二进制和十六进制值。因此,为了保持内存紧凑,我开始更喜欢使用BYTE或unsigned char的想法。我想用这个坐标对做的是:

假设我们有一个十六进制值[0x05,0x0C]的坐标对,我希望最终值为0x5C。我也想做相反的事情,但我想我已经找到了一个解决问题的答案。我正在考虑使用&或者但是,我错过了一些东西,因为我没有得到正确的值。

然而,当我输入此内容并查看相反的情况时:这就是我想出来的,它似乎正在发挥作用。

byte a = 0x04;
byte b = 0x0C;

byte c = (a << 4) | b;

std::cout << +c;

打印的价值是76;转换为十六进制的是0x4C。

由于我已经计算出这个计算,有没有更有效的方法?

编辑

在做了一些测试之后,合并初始两个的操作给了我正确的值,但是当我正在进行相反的操作时:

byte example = c;
byte nibble1 = 0x0F & example;
byte nibble2 = (0xF0 & example) >> 4;

std::cout << +nibble1 << " " << +nibble2 << std::endl;

打印输出12 4。这是正确的还是应该关注?如果最坏的情况发生,我可以重命名这些值以指示它们的坐标值。

修改

稍微考虑一下后,我不得不将反向操作修改为:

 byte example = c;
 byte nibble1 = (0xF0 & example) >> 4;
 byte nibble2 = (0x0F & example);

 std:cout << +nibble1 << " " << +nibble2 << std::endl;

这打印出4 12这是我正在寻找的正确顺序!

1 个答案:

答案 0 :(得分:1)

首先,要注意事实上有17个值在0..16范围内。你的值可能是0..15,因为如果它们实际上都是0到16的范围,你将无法将每个可能的坐标对唯一地存储到一个字节中。

您提交的代码提取非常有效,您正在使用位运算符,这是您可以要求处理器执行的最快的操作。

对于“反向”(将你的字节分成两个4位值),你在考虑使用&amp;时是对的。只需在正确的时间应用4位移位。