2012-04-09 55 views
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位。我的想法是,我取一個無符號長整型(64位)。
可以說,我需要散列1和5.Now

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

之間的距離由於我有64位,我存儲在所述第一31位的第一數目和第二31位的第二數目。這保證了可以用於散列的唯一鍵。

,但是當我這樣做:

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

k的值變爲零。

我不能環繞此轉移概念我的頭。

本質上講我想acheive是,

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

我怎樣才能達致這讓唯一鍵的每對?

語言:C 我正在運行在64位的AMD Opteron處理器的代碼。 sizeof(ulong)返回8.所以它是64位。在這種情況下我需要很長時間嗎?

此外,我需要知道,如果這將創造獨特的鑰匙?根據我的理解,它似乎創建了唯一的密鑰。但我想要確認。

+2

請將相關的語言標籤添加到您的問題。 – 2012-04-09 19:18:57

+0

另外,如果你想要第一個整數在前32位,你爲什麼要移動31? – 2012-04-09 19:19:26

+0

我也試過32。結果爲0.所以我認爲我太多地移動了一個,並且嘗試了31.猜測32是正確的,然後 – 2012-04-09 21:16:44

回答

2

的概念是有意義的。正如Oli補充說的,你想要移動32位,而不是31位 - 移位31位會把位移移到第31位,所以如果你回到右邊去嘗試獲得第一個數字,你最終會丟失一點,第二個數字可能會很大,因爲您可以在最高位放置1。

但是,如果你想要做的位操作,我會怎麼做,而不是:

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

它真的應該,雖然產生相同的結果。你確定你的機器上長64位嗎?情況並非總是如此(儘管通常是這樣,我認爲)。如果long長度實際上是32位,則2 < < 31將導致0.

R有多大?如果R不超過65535,你可以逃脫32位大小的變量...

+0

R可能大於65535但是對於現在我可以處理小於65535的值。 – 2012-04-09 21:15:26

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. 

你幾乎肯定要什麼/需要做的是轉換klong 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

+0

+1。是的,我已經得出這是問題,但正在等待語言標籤被添加! – 2012-04-09 19:44:28

+0

@OliCharlesworth:是的 - 我也等了一陣子,但有點放棄了,並且用「C或類似的」語言踢了一腳,想'''做移動就足夠了'從中猜測。 :-) – 2012-04-09 19:47:26