将两个整数与位移组合在一起

时间:2012-04-09 19:16:44

标签: bit-manipulation

我正在编写一个程序,我必须在哈希表中存储数字对之间的距离。 我将获得一个范围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|

如何实现这一目标以获得每对的唯一键?

语言:C 我在64位amd opteron处理器上运行代码。 sizeof(ulong)返回8.因此它是64位。在这种情况下我需要很长时间吗?

此外,我需要知道这是否会创建唯一键?根据我的理解,它确实似乎创建了唯一的密钥。但我想要确认。

2 个答案:

答案 0 :(得分: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转换为long long ,然后将其向左移动,这样您就可以转换为64位字

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

答案 1 :(得分:2)

这个概念很有意义。正如Oli补充的那样,你想要换32,而不是31 - 换31会把它换成第31位,所以如果你向右移动试图得到第一个数字,你最终会有点失踪,而第二个数字可能很大,因为你可以在最高位加一个1。

但是如果你想做位操作,我会改为:

k = 1&lt;&lt; 32; k = k | 5;

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

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