2012-04-09 19 views
1

私はプログラムを書いているので、ハッシュテーブルに数字の対の間の距離を格納する必要があります。 私はレンジR.は、今私は、次のペア間の距離を見つける必要があり範囲が5 されると言うことができます与えられます。2つの整数とビットシフトの組み合わせ

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ビットがあります。私の考えは、私は符号なしlong(64ビット)を取ることでした。
は私が64ビットを有するので、1と5.Now

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

間の距離をハッシュする必要があると言うことができ、私は最初の31ビットと第31ビットの2番目の数の最初の番号を記憶しています。これにより、ハッシュに使用できる一意のキーが保証されます。

が、私はこれを行うとき:

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

をkの値がゼロになります。

私はこの変化する概念の周りに私の頭を包むことができません。私はacheiveしようとしているものを基本的に

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

がどのように私は、各ペアのためのユニークなキーを取得するには、これをacheiveすることができ、ということでしょうか?

言語:C 私は64ビット版のopteronプロセッサでコードを実行しています。 sizeof(ulong)は8を返します。したがって、64ビットです。このような場合、私は長い時間が必要ですか?

また、これが固有のキーを作成するかどうかを知る必要がありますか?私の理解から、ユニークなキーを作成するように見えます。しかし、私は確認が欲しい。

+2

質問に関連する言語タグを追加してください。 –

+0

また、最初の整数を上位32ビットにしたいのであれば、なぜ31ずつシフトしていますか? –

+0

私も32を試しました。だから、私は1をあまりシフトさせて31を試したと思った。推測32が正しいと思った。 –

答えて

2

概念が理にかなっています。 Oliが追加したように、31でなく32でシフトしたいのですが、31でシフトすると31番目のビットになります。最初の数字を取得しようとすると右に移動した場合、最上位ビットに1を入れることができるので、2番目の数字は潜在的に巨大です。

しかし、あなたはビット操作を行いたい場合は、私が代わりに行います:

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

本当に同じ結果が得られるはずです。マシンの長さが64ビットだと確信していますか?これは必ずしもそうとは限りません(通常はそうですが)。長いは、実際に32ビットである場合、2 < < 31は0

をもたらすであろうRはどの大きさでありますか?もしRが65535を超えないならば、32ビットサイズの変数で取り除くことができます。

+0

Rは65535より大きい可能性がある今私は65535未満の値に対処することができます。 –

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. 

は、あなたが64ビット・ワードにシフトしているので、それは、左シフト前long longkを変換しています。この場合

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; 

あなたは16進数で、both_numbersをプリントアウト(例えば)あれば、あなたは0x0000000200000005を取得する必要があります。

+0

+1。うん、私はこれが問題だと判断したが、追加する言語タグを待っていた! –

+0

@OliCharlesworth:えええええええええええええええええええええええええええええええれば、「Cか何か[...]類似の」言語を叩いて、「<<」がシフトを行うと考えると、手がかりが足りました〜から推測する。 :-) –

関連する問題