编码:可视化位图
在過(guò)去的一個(gè)月左右的時(shí)間里,我每天花費(fèi)一些時(shí)間來(lái)閱讀Neo4j代碼庫(kù)的新部分,以使其更加熟悉,而我最喜歡的類(lèi)之一是Bits類(lèi),該類(lèi)可以完成所有底層工作,并且到磁盤(pán)。
特別是,我喜歡它的toString方法,該方法返回以字節(jié),整數(shù)和長(zhǎng)整數(shù)形式存儲(chǔ)的值的二進(jìn)制表示形式。
我認(rèn)為嘗試編寫(xiě)自己的函數(shù)將是一個(gè)有趣的練習(xí),該函數(shù)接受32位映射,并根據(jù)是否設(shè)置了位返回包含1或0的字符串。
關(guān)鍵的見(jiàn)解是,我們需要從最高位開(kāi)始向下迭代,然后創(chuàng)建該值的位掩碼,并使用完整的位圖按位進(jìn)行處理。 如果該計(jì)算的結(jié)果為0,則不設(shè)置該位,否則為1。
例如,要檢查是否設(shè)置了最高位(索引31),我們的位掩碼將設(shè)置第32位,所有其他位都設(shè)置為0。
java>?(1?<<?31)?&?0x80000000 java.lang.Integer?res5?=?-2147483648如果要檢查是否設(shè)置了最低順序位,則應(yīng)運(yùn)行以下計(jì)算:
java>?(1?<<?0)?&?0x00000001 java.lang.Integer?res7?=?0java>?(1?<<?0)?&?0x00000001 java.lang.Integer?res8?=?1現(xiàn)在,將其放入檢查位圖的所有32位而不是僅檢查我們定義的位的函數(shù)中:
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(); }并進(jìn)行快速測(cè)試以檢查其是否有效:
@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
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
- 上一篇: 门禁一体机密码设置(门禁一体机默认密码)
- 下一篇: JDK 9 REPL:入门