2016-03-03 99 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,我不确定你会为你所做的事情需要这些,但是谁知道。