package it.unimi.dsi.bits; import it.unimi.dsi.bits.Fast; import junit.framework.TestCase; public class FastTest extends TestCase { public void testCeilLog2() { for( int i = 1; i < 1000; i++ ) assertEquals( (int)Math.ceil( Math.log( i ) / Math.log( 2 ) ), Fast.ceilLog2( i ) ); } public void testLength() { assertEquals( 1, Fast.length( 0 ) ); assertEquals( 1, Fast.length( 0L ) ); for( int i = 1; i < 100; i++ ) assertEquals( Fast.mostSignificantBit( i ) + 1, Fast.length( i ) ); for( long i = 1; i < 100; i++ ) assertEquals( Fast.mostSignificantBit( i ) + 1, Fast.length( i ) ); } public void testMostSignificantBit() { assertEquals( -1, Fast.mostSignificantBit( 0 ) ); for( int i = 0; i < 64; i++ ) { assertEquals( i, Fast.mostSignificantBit( 1L << i ) ); assertEquals( i, Fast.mostSignificantBit( 1L << i | 1 ) ); assertEquals( i, Fast.mostSignificantBit( 1L << i ) ); assertEquals( i, Fast.mostSignificantBit( 1L << i | 1 ) ); } for( long i = 1; i < ( 1L << 62 ); i += 10000000000000L ) assertEquals( Long.toString( i ), 63 - Long.numberOfLeadingZeros( i ), Fast.mostSignificantBit( i ) ); } public void testLeastSignificantBit() { assertEquals( -1, Fast.leastSignificantBit( 0 ) ); for( int i = 0; i < 64; i++ ) { assertEquals( i, Fast.leastSignificantBit( 1L << i ) ); assertEquals( 0, Fast.leastSignificantBit( 1L << i | 1 ) ); assertEquals( i, Fast.leastSignificantBit( 1L << i ) ); assertEquals( 0, Fast.leastSignificantBit( 1L << i | 1 ) ); } for( long i = 1; i < ( 1L << 62 ); i += 10000000000000L ) assertEquals( Long.toString( i ), Long.numberOfTrailingZeros( i ), Fast.leastSignificantBit( i ) ); } public void testCount() { assertEquals( 0, Fast.count( 0 ) ); assertEquals( 1, Fast.count( 1 ) ); assertEquals( 64, Fast.count( 0xFFFFFFFFFFFFFFFFL ) ); assertEquals( 32, Fast.count( 0xFFFFFFFFL ) ); assertEquals( 32, Fast.count( 0xAAAAAAAAAAAAAAAAL ) ); } public void testSelect() { assertEquals( 0, Fast.select( 1, 0 ) ); for( int i = 0; i < 64; i++ ) assertEquals( i, Fast.select( 0xFFFFFFFFFFFFFFFFL, i ) ); for( int i = 1; i < 32; i++ ) assertEquals( 2 * i + 1, Fast.select( 0xAAAAAAAAAAAAAAAAL, i ) ); } public void testInt2Nat() { assertEquals( Integer.MAX_VALUE, Fast.int2nat( Integer.MIN_VALUE / 2 ) ); assertEquals( Integer.MAX_VALUE - 2, Fast.int2nat( Integer.MIN_VALUE / 2 + 1 ) ); assertEquals( Integer.MAX_VALUE - 1, Fast.int2nat( Integer.MAX_VALUE / 2 ) ); for( int i = 0; i < 16; i++ ) assertEquals( 2*i, Fast.int2nat( i ) ); for( int i = -16; i < 0; i++ ) assertEquals( -2*i-1, Fast.int2nat( i ) ); assertEquals( Long.MAX_VALUE, Fast.int2nat( Long.MIN_VALUE / 2 ) ); assertEquals( Long.MAX_VALUE - 2, Fast.int2nat( Long.MIN_VALUE / 2 + 1 ) ); assertEquals( Long.MAX_VALUE - 1, Fast.int2nat( Long.MAX_VALUE / 2 ) ); for( int i = 0; i < 16; i++ ) assertEquals( 2L*i, Fast.int2nat( i ) ); for( int i = -16; i < 0; i++ ) assertEquals( -2L*i-1, Fast.int2nat( i ) ); } public void testNat2Int() { assertEquals( Integer.MIN_VALUE / 2, Fast.nat2int( Integer.MAX_VALUE ) ); assertEquals( Integer.MIN_VALUE / 2 + 1, Fast.nat2int( Integer.MAX_VALUE - 2 ) ); assertEquals( Integer.MAX_VALUE / 2, Fast.nat2int( Integer.MAX_VALUE - 1 ) ); for( int i = 0; i < 16; i++ ) assertEquals( i, Fast.nat2int( 2*i ) ); for( int i = -16; i < 0; i++ ) assertEquals( i, Fast.nat2int( -2*i-1 ) ); assertEquals( Long.MIN_VALUE / 2 + 1, Fast.nat2int( Long.MAX_VALUE - 2 ) ); assertEquals( Long.MIN_VALUE / 2, Fast.nat2int( Long.MAX_VALUE ) ); assertEquals( Long.MAX_VALUE / 2, Fast.nat2int( Long.MAX_VALUE - 1 ) ); for( int i = 0; i < 16; i++ ) assertEquals( i, Fast.nat2int( 2L*i ) ); for( int i = -16; i < 0; i++ ) assertEquals( i, Fast.nat2int( -2L*i-1 ) ); } public void testLeastMostSignificantBit() { for( int i = 0; i < 32; i++ ) { assertEquals( i, Fast.leastSignificantBit( 1 << i ) ); assertEquals( i, Fast.mostSignificantBit( 1 << i ) ); assertEquals( 0, Fast.leastSignificantBit( 1 << i | 1 ) ); assertEquals( i, Fast.mostSignificantBit( 1 << i | 1 ) ); assertEquals( i, Fast.leastSignificantBit( 1L << i ) ); assertEquals( i, Fast.mostSignificantBit( 1L << i ) ); assertEquals( 0, Fast.leastSignificantBit( 1L << i | 1 ) ); assertEquals( i, Fast.mostSignificantBit( 1L << i | 1 ) ); } for( int i = 32; i < 64; i++ ) { assertEquals( i, Fast.leastSignificantBit( 1L << i ) ); assertEquals( i, Fast.mostSignificantBit( 1L << i ) ); assertEquals( 0, Fast.leastSignificantBit( 1L << i | 1 ) ); assertEquals( i, Fast.mostSignificantBit( 1L << i | 1 ) ); } } }