我最近遇到了创建具有指定位长度值的数组的问题。说一个13bits而不是8,16,32等数组。我试着寻找一个关于它的好教程/文章,因为我是位操作的新手。虽然我不确定要搜索什么。
我认为数组可以使用支持数组的字节或长数...
我的最终问题是,如果有重复的问题或教程可以告诉我。
如果没有,或许可以给我一个例子。如果你有时间写一个简短的解释
谢谢。
编辑:目的不是制作一长串说长,而只使用40%。我想把它打包在一起,以节省空间,以便与我制作的东西兼容。
答案 0 :(得分:0)
在java中“创建自己的基本类型”是不可能的。另外我不认为这附近有任何图书馆可以做你想要的。我认为大多数人都会失去一些内存,特别是在比特级别。也许C或Cpp会是一个更明智的选择(我甚至不确定)。
您必须创建自己的位操作库。有很多方法可以做到,我会给你一个。我开始使用byte [],但它更复杂。通常,使用最大的普通类型(例如:对于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
是您的号码开始的位。所以这意味着在你的13bits元素中,第一个(左)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,我不确定你是否会因为你正在做的事而需要这个但是谁知道。