【问题标题】:Combining 2 Hex Values Into 1 Hex Value将 2 个十六进制值合并为 1 个十六进制值
【发布时间】:2016-07-25 03:37:37
【问题描述】:

我有一对坐标值,每个值的范围都是 [0,15]。现在我可以使用一个无符号的,但是由于 16 x 16 = 256 个可能的坐标位置,这也代表了 1 个字节的所有二进制和十六进制值。因此,为了保持内存紧凑,我开始更喜欢使用 BYTE 或无符号字符的想法。我想用这个坐标对做的是:

假设我们有一个十六进制值 [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,这是我正在寻找的正确顺序!

【问题讨论】:

  • 我猜没有。请考虑如果b &gt; 0x0F 会发生什么。为ab 应用4 位掩码或以某种方式处理它。另外,0x0C 确实是12

标签: c++ hex bit-manipulation byte


【解决方案1】:

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

您提交的代码提取非常高效,您使用的是位运算符,这是您可以要求处理器做的最快的事情。

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

【讨论】:

  • 是的,他们是 0-15;我注意到了这一点,并且在您给出答案之前已经进行了编辑。
  • 我将在我的一个数据结构中使用这两个计算来创建坐标对的查找表。在我可以应用这些之前,我需要实现将所有坐标对生成为 256 个值的数组的算法,但是顺序本身依赖于特定的结构。我一直在努力解决这个问题,我在这里有一个问题:stackoverflow.com/questions/36416290/… 一旦我能够生成这个查找表,我应该能够将当前结构转换为byte 并压缩它们,然后在需要时提取他们。
猜你喜欢
  • 2018-07-26
  • 2018-07-16
  • 1970-01-01
  • 2014-02-05
  • 2011-08-04
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多