2016-04-05 490 views
0

我有一个坐标对值,每个值的范围从[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这是正在寻找的正确顺序!

+0

我想没有。请考虑如果'b> 0x0F'会发生什么情况。应用4位掩码或以某种方式处理'a'和'b'。另外,0x0C确实是'12'。 – LogicStuff

回答

1

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

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

对于“反向”(将您的字节拆分为两个4位值),您在考虑使用&时是正确的。只需在适当的时间应用4位移位。

+0

是的,他们是0-15;我注意到了,在你给出答案之前已经做了编辑。 –

+0

我将在我的一个数据结构中使用这两个计算来创建坐标对的查找表。在我可以应用这些之前,我需要实现算法来将所有坐标对生成为256个数值的数组,但是顺序本身依赖于特定的结构。我一直在努力,我在这里有一个问题:http://stackoverflow.com/questions/36416290/implementing-a-lookup-table一旦我能够生成这个查找表,我应该然后能够将当前结构转换为'byte'并压缩它们,然后在需要时提取它们。 –