令人讨厌的是,在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开发人员无法找到更好的解决方案,那么它可能是最佳的。也意味着没有秘密字节码指令可以做到这一点。