我有一对坐标值,每个值的范围为[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
这是我正在寻找的正确顺序!
答案 0 :(得分:1)
首先,要注意事实上有17个值在0..16范围内。你的值可能是0..15,因为如果它们实际上都是0到16的范围,你将无法将每个可能的坐标对唯一地存储到一个字节中。
您提交的代码提取非常有效,您正在使用位运算符,这是您可以要求处理器执行的最快的操作。
对于“反向”(将你的字节分成两个4位值),你在考虑使用&amp;时是对的。只需在正确的时间应用4位移位。