我有一个坐标对值,每个值的范围从[0,15]。现在我可以使用无符号数,但是由于16 x 16 = 256个可能的坐标位置,这也代表了1个字节的所有二进制和十六进制值。所以为了保持内存紧凑,我开始更喜欢使用BYTE或无符号字符的想法。我想用这个坐标对做的是:将2个十六进制值合并为1个十六进制值
假设我们有一个坐标对与十六进制值[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;
这是打印输出。这是正确的还是应该是一个问题?如果最坏情况发生,我可以重新命名这些值来指示它们是哪个坐标值。
编辑
思考这个一点点,并从一些建议后,我不得不修改的反向操作,以这样的:
byte example = c;
byte nibble1 = (0xF0 & example) >> 4;
byte nibble2 = (0x0F & example);
std:cout << +nibble1 << " " << +nibble2 << std::endl;
而这种打印出4 12
这是正在寻找的正确顺序!
我想没有。请考虑如果'b> 0x0F'会发生什么情况。应用4位掩码或以某种方式处理'a'和'b'。另外,0x0C确实是'12'。 – LogicStuff