[英]Combining 2 Hex Values Into 1 Hex Value
我有一个值的坐标对,每个值的范围是[0,15]。 现在,我可以使用无符号,但是由于16 x 16 = 256个可能的总坐标位置,因此它也表示1字节的所有二进制和十六进制值。 因此,为了保持内存紧凑,我开始偏爱使用BYTE或未签名的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..16范围内的17个值。 您的值可能是0..15,因为如果它们的实际范围是0到16,则将无法将每个可能的坐标对唯一存储到一个字节中。
您提交的代码提取效率很高,您正在使用位运算符,这是您可以要求处理器执行的最快的操作。
对于“反向”(将字节分成两个4位值),在考虑使用&时是正确的。 只需在正确的时间应用4位移位即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.