獨特的2字節整數我有三個整數:生成三個整數
- 第一號的範圍爲1-600
- 第二個數字的範圍是0-4
- 三數範圍0〜 14
我需要生成從上述整數的2字節的唯一整數,使得:
- 再次使用相同數量會導致相同數量的
- 能夠從獨特的數量取回所有三個數字
- 唯一的編號應> 0 & & < 32768(2字節)
我已經搜索瞭解決方案,但大多數解決方案將字節數從2增加到4個字節,這在我的情況下不是一個選項。
獨特的2字節整數我有三個整數:生成三個整數
我需要生成從上述整數的2字節的唯一整數,使得:
我已經搜索瞭解決方案,但大多數解決方案將字節數從2增加到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
以上所有數字均假定非負,並且假定通常的整數除法舍入,這只是斬去任何小數。
將它們轉換爲零填充的字符串。用零填充後連接它們。然後將它們轉換回整數。
因此20-1-8會變成「020108」,然後20108變成一個整數。
要獲取數字,請將其重新轉換爲字符串,並根據數字位數從右向左進行解析。
假設數字是500-1-14。這將是050001014.將其轉換爲整數..它將是50001014,它不再是一個2字節的整數。 – ykh
我認爲海德裝置(第一-1)+ range_of_first *秒+ range_of_first * range_of_second *第三 =(第一-1)+ 600 *第二+ 600 * 5 *第三 =(第一-1)+ 600 *第二+ 3000 *第三。
您需要存儲45000個不同的值,因此您不能將它們放入2個有符號的字節中,但它們將適合2個無符號字節。
正如其他人提到的,範圍[1..600],[0..4]和[0 ..14]導致45000個可能值,對於您的範圍(0..32768)來說太多了,所以絕對唯一性在該約束下是不可能的。 – Wormbo