2016-03-03 63 views
-2


我最近遇到了創建具有指定位長的值的數組的問題。用13位而不是8,16,32等來表示一個數組。我嘗試尋找一個很好的教程/文章,因爲我是位操作的新手。雖然我不確定要搜索什麼。
我認爲陣列可以支持字節或長陣列...不同值的位長度陣列

我最終的問題是如果你能告訴我,如果有重複的問題或教程。
如果不是,也許給我看一個例子。如果你有時間寫一個簡短的解釋。

謝謝。

編輯:目的不是爲了說一個long的數組,而只使用它的40%。我希望它被包裝在一起,以節省空間,以便與我正在製作的東西兼容。

回答

0

在java中不可能「創建自己的原始類型」。我也不認爲這裏有任何圖書館可以做你想做的事。我認爲大多數人會因爲丟失一些內存而付出代價,特別是在比特級別上。也許C或Cpp會是一個更明智的選擇(我甚至不確定)。

您必須創建您自己的位操作庫。有很多方法可以做到,我會給你一個。我開始使用一個字節[],但它更復雜。通常,使用最大的普通類型(例如:對於48位元素,使用32位類型作爲存儲)。所以讓我們用int數組(16位)來處理您的13位類型中的100個。我將使用big-endian風格的存儲。

int intArraySize = 100 * 16/13 + 1; // + 1 is just to be sure... 
int[] intArray = new int[byteArraySize]; 

現在,你如何訪問第六個值例如。您將始終需要至少和最多兩個int整數和一個整數來存儲它。

int pos = 6; 
int buffer = 0; 
int firstPart = int Array[ (pos * 13) /16]; // 1010 0110 1100 0011 
int secondPart = int Array[ (pos * 13) /16 + 1]; // 1001 1110 0101 1111 
int begin = pos * 13 % 16; 

變量begin = 14是你的號碼開始的位。所以這意味着你的13位元素在第一個(左)int中有(16-14)3位,其餘(13-3 = 10)在第二個(右)中。 你想要的數量是1010 0110 1100 0 {011和1001 1110} 0101 1111.

你現在要把這兩個整數合併成一個。第二部分右移第三部分(所以它是最後一個數字的右邊部分),然後左移第一部分10次,將它們添加到緩衝區中。因爲它是一個13位的元素,所以你需要清除(使用位掩碼)緩衝區中16位的3個第一個元素,瞧!

我會讓你猜猜如何在數組中插入一個值(嘗試做相同的步驟,但是反過來),並小心不要擦除其他值。如果你還沒有看:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

聲明:我沒有嘗試的代碼,但你得到的一般想法。可能有一些錯誤,也許你必須添加或刪除1才能開始。但你得到了一般想法。你應該做的第一件事是創建一個函數,打印/記錄任何整數(或字節,或其他)到它的二進制表示。多種可能性在這裏:Print an integer in binary format in Java因爲你需要他們來測試你的代碼的每一步。

我仍然認爲以這種方式存儲您的特殊號碼是一個壞主意(認真記憶很少會成爲一個問題),但是我發現練習很有趣,也許您確實需要這種存儲。如果你很好奇,看看ByteArrayOutputStream,我不確定你會爲你所做的事情需要這些,但是誰知道。