KUID extends ByteArray<KUID> implements Identifier, 
    Key<KUID>, Xor<KUID>, Negation<KUID>, Cloneable, Digestable { @Override public int bitIndex(KUID otherId) { if (!isCompatible(otherId)) { throw new IllegalArgumentException("otherKey=" + otherId); } boolean allNull = true; for (int i = 0; i < value.length; i++) { byte b1 = value[i]; byte b2 = otherId.value[i]; if (b1 != b2) { int xor = b1 ^ b2; for (int j = 0; j < Byte.SIZE; j++) { if ((xor & mask(j)) != 0) { return (i * Byte.SIZE) + j; } } } if (b1 != 0) { allNull = false; } } if (allNull) { return KeyAnalyzer.NULL_BIT_KEY; } return KeyAnalyzer.EQUAL_BIT_KEY; } private  KUID(byte[] key); static KUID createRandom(int length); static KUID createRandom(KUID otherId); static KUID create(byte[] key); static KUID create(byte[] key, int offset, int length); static KUID create(String key, int radix); static KUID createWithPrefix(KUID prefix, int bitIndex); static KUID min(int length); static KUID max(int length); @Override KUID getId(); boolean isCompatible(KUID otherId); @Override void update(MessageDigest md); @Override int lengthInBits(); @Override boolean isBitSet(int bitIndex); @Override int bitIndex(KUID otherId); @Override boolean isPrefixedBy(KUID prefix); @Override KUID xor(KUID otherId); @Override KUID negate(); KUID min(); KUID max(); KUID set(int bitIndex); KUID unset(int bitIndex); KUID flip(int bitIndex); int commonPrefix(KUID otherId); boolean isMin(); boolean isMax(); boolean isCloserTo(KUID key, KUID otherId); int compareTo(KUID key, KUID otherId); @Override int compareTo(KUID otherId); @Override KUID clone(); BigInteger toBigInteger();  }
@Test public void bitIndex() { KUID id1 = KUID.create(new byte[] { (byte)0xAC , (byte)0x69 , }); KUID id2 = KUID.create(new byte[] { (byte)0xAC , (byte)0x61 , }); int bitIndex1 = id1.bitIndex(id2); int bitIndex2 = id2.bitIndex(id1); TestCase.assertEquals(12, bitIndex1); TestCase.assertEquals(12, bitIndex2); }