1

私はプログラムを書いています。数値のペア間の距離をハッシュテーブルに保存する必要があります。

範囲 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ビットがあります。私の考えは、私は unsigned long (64 ビット) を取るということでした。
1 から 5 の間の距離をハッシュする必要があるとしましょう。

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

64 ビットなので、最初の数値を最初の 31 ビットに格納し、2 番目の数値を次の 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_numbers16 進数で出力すると、 が得られるはずです0x0000000200000005

于 2012-04-09T19:40:18.847 に答える
2

コンセプトは理にかなっています。Oli が追加したように、31 ではなく 32 でシフトする必要があります。31 でシフトすると、31 番目のビットに配置されるため、右にシフトして最初の数値を取得しようとすると、少し欠けてしまいます。 2 番目の数値は、最上位ビットに 1 を入れることができたので、巨大になる可能性があります。

しかし、ビット操作を行いたい場合は、代わりに次のようにします。

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

ただし、実際には同じ結果が得られるはずです。お使いのマシンで long が 64 ビットであることは確かですか? これは常にそうであるとは限りません (通常はそうだと思いますが)。longが実際に 32 ビットの場合、結果2<<31は 0 になります。

Rの大きさは?Rが65535を超えない場合、32ビットサイズの変数を使用できます...

于 2012-04-09T19:32:39.150 に答える