1

我正在编写一个程序,我必须将数字对之间的距离存储在哈希表中。

我将得到一个 Range R。假设范围是 5。现在我必须找到以下对之间的距离:

1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

也就是说,对的总数是(R^2/2 -R)。我想将它存储在哈希表中。所有这些都是无符号整数。所以有32位。我的想法是,我采用无符号长整数(64 位)。
假设我需要散列 1 和 5 之间的距离。现在

long k = 1;
k = k<<31;
k+=5;

因为我有 64 位,所以我将第一个数字存储在前 31 位中,将第二个数字存储在第二个 31 位中。这保证了唯一的键,然后可以用于散列。

但是当我这样做时:

long k = 2;
k << 31;
k+= 2;

k 的值变为零。

我无法理解这个不断变化的概念。

基本上我想要实现的是,

An unsigned long has    | 32bits    |  32 bits  |
Store                   |1st integer|2nd integer|

如何实现这一点以获得每对的唯一密钥?

我在 64 位 AMD Opteron 处理器上运行代码。 sizeof(ulong)返回 8。所以它是 64 位。long long在这种情况下我需要一个吗?

我还需要知道这是否会创建唯一键?据我了解,它似乎确实创建了唯一的键。但我想要一个确认。

4

2 回答 2

3

假设您使用的是 C 或遵循模糊相似规则的东西,您的问题主要出在类型上。

long k = 2;  // This defines `k` a a long
k << 31;     // This (sort of) shifts k left, but still as a 32-bit long.

您几乎可以肯定想要/需要做的是在将其向左移动之前k转换为 a ,因此您将在 64 位字中移动。long long

unsigned long first_number = 2;
unsigned long long both_numbers = (unsigned long long)first_number << 32;
unsigned long second_number = 5;
both_numbers |= second_number;

在这种情况下,如果(例如)您both_numbers以十六进制打印出 ,您应该得到0x0000000200000005.

于 2012-04-09T19:40:18.847 回答
2

这个概念是有道理的。正如 Oli 所添加的,您希望移动 32,而不是 31 - 移动 31 会将其放在第 31 位,因此如果您向右移动以尝试获取第一个数字,您最终会丢失一点,第二个数字可能很大,因为你可以在最高位放一个 1。

但是如果你想做位操作,我会这样做:

k = 1 << 32;
k = k|5;

它确实应该产生相同的结果。您确定您的机器上的 long 是 64 位吗?情况并非总是如此(尽管我认为通常是这样)。如果long实际是 32 位,2<<31则结果为 0。

R有多大?如果 R 不超过 65535,您可以使用 32 位大小的变量...

于 2012-04-09T19:32:39.150 回答