【发布时间】: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 > 0x0F会发生什么。为a和b应用4 位掩码或以某种方式处理它。另外,0x0C确实是12。
标签: c++ hex bit-manipulation byte