繁体   English   中英

将2个十六进制值合并为1个十六进制值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM