在过去的一个月左右的时间里,我每天花费一些时间来阅读Neo4j代码库的新部分,以使其更加熟悉,而我最喜欢的类之一是Bits类,该类可以完成所有底层工作,并且到磁盘。
特别是,我喜欢它的toString方法,该方法返回以字节,整数和长整数形式存储的值的二进制表示形式。
我认为尝试编写自己的函数将是一个有趣的练习,该函数接受32位映射,并根据是否设置了位返回包含1或0的字符串。
关键的见解是,我们需要从最高位开始向下迭代,然后创建该值的位掩码,并使用完整的位图按位进行处理。 如果该计算的结果为0,则不设置该位,否则为1。
例如,要检查是否设置了最高位(索引31),我们的位掩码将设置第32位,所有其他位都设置为0。
java> (1 << 31) & 0x80000000
java.lang.Integer res5 = -2147483648
如果要检查是否设置了最低顺序位,则应运行以下计算:
java> (1 << 0) & 0x00000001
java.lang.Integer res7 = 0
java> (1 << 0) & 0x00000001
java.lang.Integer res8 = 1
现在,将其放入检查位图的所有32位而不是仅检查我们定义的位的函数中:
private String asString( int bitmap )
{
StringBuilder sb = new StringBuilder();
sb.append( "[" );
for ( int i = Integer.SIZE - 1; i >= 0; i-- )
{
int bitMask = 1 << i;
boolean bitIsSet = (bitmap & bitMask) != 0;
sb.append( bitIsSet ? "1" : "0" );
if ( i > 0 && i % 8 == 0 )
{
sb.append( "," );
}
}
sb.append( "]" );
return sb.toString();
}
并进行快速测试以检查其是否有效:
@Test
public void shouldInspectBits()
{
System.out.println(asString( 0x00000001 ));
// [00000000,00000000,00000000,00000001]
System.out.println(asString( 0x80000000 ));
// [10000000,00000000,00000000,00000000]
System.out.println(asString( 0xA0 ));
// [00000000,00000000,00000000,10100000]
System.out.println(asString( 0xFFFFFFFF ));
// [11111111,11111111,11111111,11111111]
}
整齐!
翻译自: https://www.javacodegeeks.com/2015/05/coding-visualising-a-bitmap.html