编码:可视化位图

在过去的一个月左右的时间里,我每天花费一些时间来阅读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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值