首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分配字节数组以获取40亿位

分配字节数组以获取40亿位
EN

Stack Overflow用户
提问于 2011-08-05 00:29:35
回答 8查看 7.2K关注 0票数 4

我正在读一本名为《破解编码面试》的书,作者是Laakman。有一部分是她(作者p.g.202) did:

代码语言:javascript
复制
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亿比特?我试过了:

代码语言:javascript
复制
byte[] bitfield = new byte[0xfffffff *2];

尽管上述操作会导致jvm耗尽堆空间。

既然我们这样做了,那么表达十六进制值的最佳方式是什么呢?例如0xFFFFFFFFFF?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-08-05 00:40:15

我不明白为什么你要乘以2。最简单的方法就是取(40亿/ 8)的十六进制表示--我们说的“40亿”实际上是指0x100000000。

所以使用0x100000000 / 8,即0x2000000:

代码语言:javascript
复制
byte[] array = new byte[0x20000000];

如果你已经在启动时给了你的JVM足够的内存,比如使用-Xmx900M,这应该没问题。

示例代码:

代码语言:javascript
复制
public class Test {
    public static void main(String[] args) {
        byte[] bytes = new byte[0x20000000];
    }
}

默认运行:

代码语言:javascript
复制
c:\Users\Jon\Test>java Test
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at Test.main(Test.java:3)

使用更多的空间运行:

代码语言:javascript
复制
c:\Users\Jon\Test>java -Xmx900M Test
票数 5
EN

Stack Overflow用户

发布于 2011-08-05 02:14:47

作为书呆子,我会说40亿并不完全是2^32,我建议使用BitSet,它不能容纳这么多位,但2 BitSets可以

代码语言:javascript
复制
BitSet[] bitSets = { new BitSet(2 * 1000 * 1000 * 1000), 
                     new BitSet(2 * 1000 * 1000 * 1000) };

如果必须是2^32位或4 Gb (小写b是位),那么对于两个bitSets来说,这有点太多了。

代码语言:javascript
复制
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)));

显然,无论您使用哪种方法,都希望将数组包装在一个集合中,该集合隐藏了该数组是如何实现的细节。

票数 1
EN

Stack Overflow用户

发布于 2013-08-30 02:39:33

整数的MAX_VALUE为0X7fffffff。我相信她在声明的时候漏掉了数字“7”。由于策略是使用位位置来表示整数值(即每个字节有8位可以容纳最多8个整数),因此她分配了数组来容纳40亿个整数。

代码语言:javascript
复制
 byte x[] = new byte[0x7fffffff/8];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6945098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档