可视化编码
在过去的一个月左右的时间里,我每天花费一些时间来阅读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 = 0java> (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
可视化编码