2015-08-29 24 views
0

獨特的2字節整數我有三個整數:生成三個整數

  • 第一號的範圍爲1-600
  • 第二個數字的範圍是0-4
  • 三數範圍0〜 14

我需要生成從上述整數的2字節的唯一整數,使得:

  • 再次使用相同數量會導致相同數量的
  • 能夠從獨特的數量取回所有三個數字
  • 唯一的編號應> 0 & & < 32768(2字節)

我已經搜索瞭解決方案,但大多數解決方案將字節數從2增加到4個字節,這在我的情況下不是一個選項。

+1

正如其他人提到的,範圍[1..600],[0..4]和[0 ..14]導致45000個可能值,對於您的範圍(0..32768)來說太多了,所以絕對唯一性在該約束下是不可能的。 – Wormbo

回答

4

首先,我們將第一個範圍轉換爲0-599,在下面標記爲first-1。然後,所有你需要做的是乘法的數字加在一起,使用範圍最大值爲乘數:

range_of_first = 599 + 1 = 600 
range_of_second = 4 + 1 = 5 
range_of_third = 14 + 1 = 15 

(first-1) + range_of_first * second + range_of_first * range_of_second * third 
= (first-1) + 600*second + 600*5*third 
= result 

你可以得到最大值爲599 + 600 * 4 + 600 * 5 * 14 =

這不適用於帶符號的2字節整數(-32768..32767)。它適合2字節無符號整數(0..65535)。

如果您必須將其放入一個有符號的整數中,那麼最簡單的方法是以32位進行calculcation,然後從結果中減去(44999-32768),以便它符合2字節有符號整數的範圍。然後在解碼之前進行反轉。

而對於相反的,你需要的分裂和提醒:

first = result % range_of_first + 1 // +1 to get values 1..600 
second = result/range_of_first % range_of_second 
third = result/range_of_first/range_of_second // % range_of_third redundant 

以上所有數字均假定非負,並且假定通常的整數除法舍入,這只是斬去任何小數。

+0

我完全按照你描述的那樣實現了一切,但是數字超過了32768,當我減去它們時,我得到了重複的數字。 – ykh

+0

@ykh請注意,我在一小時前更新了答案,乘法中出現錯誤。無論如何,你能給出兩組3個數字的例子,你會得到重複嗎? – hyde

+0

@ykh這個想法不是從過大的值中減去,而是從所有的值中減去,因此在某些情況下會給你負值。如果你真的堅持要15bit的正值(0..32768),那麼你的任務就不可能放棄唯一性。 – Wormbo

0

將它們轉換爲零填充的字符串。用零填充後連接它們。然後將它們轉換回整數。

因此20-1-8會變成「020108」,然後20108變成一個整數。

要獲取數字,請將其重新轉換爲字符串,並根據數字位數從右向左進行解析。

+0

假設數字是500-1-14。這將是050001014.將其轉換爲整數..它將是50001014,它不再是一個2字節的整數。 – ykh

0

我認爲海德裝置(第一-1)+ range_of_first *秒+ range_of_first * range_of_second *第三 =(第一-1)+ 600 *第二+ 600 * 5 *第三 =(第一-1)+ 600 *第二+ 3000 *第三。

您需要存儲45000個不同的值,因此您不能將它們放入2個有符號的字節中,但它們將適合2個無符號字節。