我目前正在编写一段代码,其中我已经确定我的两位数组的串联是瓶颈,并且正在讨论如何提高效率。
我的位数组建模如下
public BitArray(int size) {
int sizeBytes = size / 8 ;
if (size % 8 !=0) sizeBytes++;
this.array = new byte[sizeBytes];
this.size = size ;
}
其中 size 是以位为单位的大小。
有效连接两个位数组时的挑战是在连接一个大小为 7 的位数组与一个大小为 6 的位数组时需要发生的跨越。因此,不可能简单地做两个数组副本。
除了我目前已经实现的解决方案之外,我正在研究的解决方案如下:计算“跨区域”(例如,5 位数组的最后 3 位)。使用 system.array.copy 复制第一个数组,使用我的 setBit 函数从第二个数组手动设置 3 个“跨越位”。将第二个数组向左移动 3System.arraycopy()
目前,我手动设置了第二个数组的每个单独的位,如下所示。
问题在于,对于位移,该操作实际上非常昂贵,因为它必须为每个字节完成,然后必须再次发生跨越。
关于如何改进上述技术的想法?
这是当前表现不佳的代码:
public static BitArray concatenate(BitArray x1_, BitArray x2_) {
if (x1_ == null) {
System.out.println("x1 is null");
int b = x2_.getArray().length;
byte[] array = new byte[b];
System.arraycopy(x2_.getArray(), 0, array, 0, b);
BitArray res = new BitArray(array);
res.setSize(x2_.getSize());
return res;
} else if (x2_ == null) {
System.out.println("x2 is null");
int b = x1_.getArray().length;
byte[] array = new byte[b];
System.arraycopy(x1_.getArray(), 0, array, 0, b);
BitArray res = new BitArray(array);
res.setSize(x1_.getSize());
return res;
}
int size1 = x1_.getSize();
int size2 = x2_.getSize();
int size = (x1_.getSize() + x2_.getSize()) / 8 ;
if ((size1 + size2)%8!=0) size++;
byte[] result = new byte[size];
System.arraycopy(x1, 0, result, 0, x1.length);
BitArray res = new BitArray(result);
res.setSize(size1 + size2);
for (int i = 0 ; i<size2 ; i++) {
res.setBit(size1 + i, x2_.getBit(i) );
}
return res;
}