【发布时间】:2016-11-11 06:35:17
【问题描述】:
我正在尝试为 3D 空间中的对象生成哈希码,以便可以使用二进制搜索算法在数组中快速找到它。
由于这个数组中的每个对象都有一个唯一的 XYZ 位置,我想我可以使用这三个值来生成哈希码。我使用以下代码尝试生成哈希码。
int64_t generateCode(int16_t x, int16_t y, int16_t z) {
int64_t hashCode = z;//Set Z bits.
hashCode <<= 16;//Shift them 16 bits.
hashCode |= y;//Set Y bits.
hashCode <<= 16;//Shift them 16 bits.
hashCode |= x;//Set X bits.
}
现在这是我所知道的问题。考虑以下代码和平:
int16_t x = -1;
cout << "X: " << bitset<16>(x) << endl;//Prints the binary value of X.
int64_t y = x;//Set Y to X. This will automatically cast the types.
cout << "Y: " << bitset<64>(y) << endl;//Prints the binary value of Y.
这个程序的输出如下:
X: 1111111111111111
Y: 1111111111111111111111111111111111111111111111111111111111111111
它保留数字的数值,但更改底层二进制文件来做到这一点。我不想修改那个二进制文件,所以我可以得到如下输出:
X: 1111111111111111
Y: 0000000000000000000000000000000000000000000000001111111111111111
通过这样做,我可以从 XYZ 值创建一个唯一的哈希码,如下所示:
Unused X Y Z
HashCode: [0000000000000000][0000000000000000][0000000000000000][0000000000000000]
这将用于二分搜索。
【问题讨论】:
-
如果你的数字不是实际数字,只是一系列字节,请使用无符号数。您不仅不需要签名号码的签名,它实际上会伤害您。