Java - 读取位作为布尔/写布尔值作为位

时间:2017-01-06 02:27:53

标签: java boolean bit-manipulation bitwise-operators bit-shift

我已经阅读了thisthat和其他几个。

令人讨厌的是,在Java中,存储boolean需要一个多字节,这应该是一位。布尔数组作弊并且每个布尔值只使用一个字节,但这仍然是他们需要的空间量的8倍。

我认为理论上至少我可以将它们视为位并将它们编码为更大的原语。对于大多数情况,int可以正常工作。当然,当我想使用它时,我必须将其转换回来,但至少我会使用内存。一个布尔值不是很多,但很多都加起来了。此外,这是一个简单的优化,会产生重大影响。

我没有看到任何方法将单个位读取为布尔值或将布尔值写为某个值(存储为byte,short,int或long)。至少不是Java。

使用BitSet是一个选项,但在数据类中,我应该编写特定于它的代码,以尽可能高效。

Probably optimized versions我提出的两种方法:

阅读,可能是最好的

public boolean read(int encoded,int index){
    return (encoded << index) < 0;
}

Alt读取,可能稍微慢一些

public boolean read(int encoded,int index){
    return (encoded << index >>> 31) == 1;
}

Alt阅读,在BitSet *

中使用
public boolean read(int encoded,int index){
    return (encoded & (1 << index)) != 0;
}

写,如果不是最佳责备编译器没有成功

public int write(int encoded,int index,boolean bit){
    int bits = 1 << (31-index);
    if(bit){
        return encoded | bits;
    }else{
        return encoded & (~bits);
    }
}

Alt写的,由其他人编写并由我改编,可能效率较低

public int write(int encoded,int index,boolean bit){
    return encoded ^ (((bit?-1:0) ^ encoded) & (1 << index));
}

当然有更好的方法吗?

*更新

看着the source code for BitSet。除了所有安全和长阵列之外,唯一不同的是我指出的那个,他们的阅读。如果处理官方util库的Java开发人员无法找到更好的解决方案,那么它可能是最佳的。也意味着没有秘密字节码指令可以做到这一点。

0 个答案:

没有答案