package net.varkhan.base.containers.array;
import junit.framework.TestCase;
/**
* @author varkhan
* @date Mar 12, 2009
* @time 6:19:14 PM
*/
public class BitArraysTest extends TestCase {
public static void assertArrayEquals(String message, boolean[] expected, boolean[] actual) {
if(expected==null) { if(actual==null) return; }
else if(expected.length==actual.length) {
boolean same = true;
for(int i=0; i<expected.length; i++) if(expected[i]!=actual[i]) { same=false; break; }
if(same) return;
}
fail(message+";\n expected: ["+BoolArrays.join(",",expected)+"];\n actual: ["+BoolArrays.join(",",actual)+"]");
}
public void testFlipBoolean() {
assertEquals("flip(00000000b,true,true,false,true)","1011",Long.toBinaryString(BitArrays.flip(0,new boolean[]{true,true,false,true})));
assertEquals("flip(00000000b,true,true,false,true,false)","1011",Long.toBinaryString(BitArrays.flip(0,new boolean[]{true,true,false,true,false})));
assertEquals("flip(00000010b,true,true,false,true,false)","1001",Long.toBinaryString(BitArrays.flip(2,new boolean[]{true,true,false,true,false})));
}
public void testFlipMask() {
assertArrayEquals("flip(00000000b,true,true,false,true)", new boolean[] { true, true, false, true }, BitArrays.flip(new boolean[] { true, true, false, true }, 0));
assertArrayEquals("flip(00000000b,true,true,false,true,false)", new boolean[] { true, false, false, true, false }, BitArrays.flip(new boolean[] { true, true, false, true, false }, 2));
}
private static int csb(int b) {
if(b==0) return 0;
int c=0;
while(b!=0) {
c+=b&0x1;
b>>>=1;
}
return c;
}
public void testCsbByte() {
for(int i=0;i<256;i++) {
assertEquals("csb("+Integer.toBinaryString(i)+")", csb(i), BitArrays.csb((byte) i));
}
System.out.println("BitArrays.csb(byte) OK");
}
public void testCsbShort() {
for(int i=0;i<256*256;i++) {
assertEquals("csb("+Integer.toBinaryString(i)+")", csb(i), BitArrays.csb((short) i));
}
System.out.println("BitArrays.csb(short) OK");
}
public void testCsbInt() {
for(int i=0;i<256*256;i++) {
assertEquals("csb("+Integer.toBinaryString(i)+")", csb(i), BitArrays.csb((int) i));
}
System.out.println("BitArrays.csb(int) OK");
}
public void testCsbLong() {
for(int i=0;i<256*256;i++) {
assertEquals("csb("+Integer.toBinaryString(i)+")", csb(i), BitArrays.csb((long) i));
}
System.out.println("BitArrays.csb(long) OK");
}
private static int lsb(int b) {
if(b==0) return 0;
int c=0;
while((b>>>c)!=0) c++;
return c;
}
public void testLsbByte() {
for(int i=0;i<256;i++) {
assertEquals("lsb("+Integer.toBinaryString(i)+")", lsb(i), BitArrays.lsb((byte) i));
}
System.out.println("BitArrays.lsb(byte) OK");
}
public void testLsbShort() {
for(int i=0;i<256*256;i++) {
assertEquals("lsb("+Integer.toBinaryString(i)+")", lsb(i), BitArrays.lsb((short) i));
}
System.out.println("BitArrays.csb(short) OK");
}
public void testLsbInt() {
for(int i=0;i<256*256;i++) {
assertEquals("lsb("+Integer.toBinaryString(i)+")", lsb(i), BitArrays.lsb((int) i));
}
System.out.println("BitArrays.csb(int) OK");
}
public void testLsbLong() {
for(int i=0;i<256*256;i++) {
assertEquals("lsb("+Integer.toBinaryString(i)+")", lsb(i), BitArrays.lsb((long) i));
}
System.out.println("BitArrays.csb(long) OK");
}
private static int rsb(int b) {
if(b==0) return -1;
int c=0;
while((b&(1<<c))==0) c++;
return c;
}
public void testRsbByte() {
for(int i=0;i<256;i++) {
assertEquals("rsb("+Integer.toBinaryString(i)+")", rsb(i), BitArrays.rsb((byte) i));
}
System.out.println("BitArrays.rsb(byte) OK");
}
public void testRsbShort() {
for(int i=0;i<256*256;i++) {
assertEquals("rsb("+Integer.toBinaryString(i)+")", rsb(i), BitArrays.rsb((short) i));
}
System.out.println("BitArrays.rsb(short) OK");
}
public void testRsbInt() {
for(int i=0;i<256*256;i++) {
assertEquals("rsb("+Integer.toBinaryString(i)+")", rsb(i), BitArrays.rsb((int) i));
}
System.out.println("BitArrays.rsb(int) OK");
}
public void testRsbLong() {
for(int i=0;i<256*256;i++) {
assertEquals("rsb("+Integer.toBinaryString(i)+")", rsb(i), BitArrays.rsb((long) i));
}
System.out.println("BitArrays.rsb(long) OK");
}
private static long mp2(int b) {
long c=0;
for(int p=0;p<32;p++) {
// Compute the 2*p bit of c as the p-th bit i
c|=(b&(1<<p))<<p;
}
return c;
}
public void testMp2Byte() {
for(int i=0;i<256;i++) {
assertEquals("mp2("+Integer.toBinaryString(i)+")", mp2(i), BitArrays.mp2((byte) i));
}
System.out.println("BitArrays.mp2(byte) OK");
}
public void testMp2Short() {
for(int i=0;i<256*256;i++) {
assertEquals("mp2("+Integer.toBinaryString(i)+")", mp2(i), BitArrays.mp2((short) i));
}
System.out.println("BitArrays.mp2(short) OK");
}
public void testMp2Int() {
for(int i=0;i<256*256;i++) {
assertEquals("mp2("+Integer.toBinaryString(i)+")", mp2(i), BitArrays.mp2((int) i));
}
System.out.println("BitArrays.mp2(int) OK");
}
private static long rev(long b, int w) {
long c=0;
for(int p=0;p<w;p++) {
// Compute the (w-p-1)-th bit of c as the p-th bit of b
// System.out.println(Long.toBinaryString(b)+" => "+p+":"+Long.toBinaryString(((b&(1<<p))==0?0:1)<<(w-p-1)));
c|=((b&(1L<<p))==0?0L:1L)<<(w-p-1);
}
return c;
}
public void testRevByte() {
for(int i=0;i<256;i++) {
assertEquals("rev("+Integer.toBinaryString(i)+")", rev(i,8), 0xFF&BitArrays.rev((byte) i));
}
System.out.println("BitArrays.rev(byte) OK");
}
public void testRevShort() {
for(int i=0;i<256*256;i++) {
assertEquals("rev("+Integer.toBinaryString(i)+")", rev(i,16), 0xFFFF&BitArrays.rev((short) i));
}
System.out.println("BitArrays.rev(byte) OK");
}
public void testRevInt() {
for(int i=0;i<256*256;i++) {
assertEquals("rev("+Integer.toBinaryString(i)+")", rev(i,32), 0xFFFFFFFFL&BitArrays.rev((int) i));
}
System.out.println("BitArrays.rev(byte) OK");
}
public void testRevLong() {
for(int i=0;i<256*256;i++) {
assertEquals("rev("+Integer.toBinaryString(i)+")", rev((long) i, 64), BitArrays.rev((long) i));
}
System.out.println("BitArrays.rev(byte) OK");
}
}