我正在读一本名为《破解编码面试》的书,作者是Laakman。有一部分是她(作者p.g.202) did:
byte[] bitfield = new byte [0xFFFFFFF/8];//there are 7 F's她分配了40亿比特。但是,0xFFFFFFF不是= 2^28-1吗?因此,她只分配了一个2^28-1/8字节的字节数组,远远没有接近40亿位。它只有2^28-1位。我的问题是-是她错了还是我做错了什么?我们如何分配40亿比特?我试过了:
byte[] bitfield = new byte[0xfffffff *2];尽管上述操作会导致jvm耗尽堆空间。
既然我们这样做了,那么表达十六进制值的最佳方式是什么呢?例如0xFFFFFFFFFF?
发布于 2011-08-05 00:40:15
我不明白为什么你要乘以2。最简单的方法就是取(40亿/ 8)的十六进制表示--我们说的“40亿”实际上是指0x100000000。
所以使用0x100000000 / 8,即0x2000000:
byte[] array = new byte[0x20000000];如果你已经在启动时给了你的JVM足够的内存,比如使用-Xmx900M,这应该没问题。
示例代码:
public class Test {
public static void main(String[] args) {
byte[] bytes = new byte[0x20000000];
}
}默认运行:
c:\Users\Jon\Test>java Test
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Test.main(Test.java:3)使用更多的空间运行:
c:\Users\Jon\Test>java -Xmx900M Test发布于 2011-08-05 02:14:47
作为书呆子,我会说40亿并不完全是2^32,我建议使用BitSet,它不能容纳这么多位,但2 BitSets可以
BitSet[] bitSets = { new BitSet(2 * 1000 * 1000 * 1000),
new BitSet(2 * 1000 * 1000 * 1000) };如果必须是2^32位或4 Gb (小写b是位),那么对于两个bitSets来说,这有点太多了。
BitSet[] bitSets = { new BitSet(1 << 28),
new BitSet(1 << 28),
new BitSet(1 << 28),
new BitSet(1 << 28) };
// set a bit
long bitToSet =
bitSets[(int) (bitToSet >>> 28)]
.set((int) (bitToSet % (1 << 28)), value);
// test is set
long bitToTest =
boolean test = bitSets[(int) (bitToTest >>> 28)]
.get((int) (bitToTest % (1 << 28)));显然,无论您使用哪种方法,都希望将数组包装在一个集合中,该集合隐藏了该数组是如何实现的细节。
发布于 2013-08-30 02:39:33
整数的MAX_VALUE为0X7fffffff。我相信她在声明的时候漏掉了数字“7”。由于策略是使用位位置来表示整数值(即每个字节有8位可以容纳最多8个整数),因此她分配了数组来容纳40亿个整数。
byte x[] = new byte[0x7fffffff/8];https://stackoverflow.com/questions/6945098
复制相似问题