this might beginner java question able calculate number bytes require store whole number. , convert number byte array. tlv encoding performing. realise java stores in twos completement ignoring that, interested in keeping binary representation.
for example, if had number 256 take 2 bytes (as 1 byte can store 2^8-1, think) convert number byte array.
where:
byte[0] = 1111 1111
byte[1] = 0000 0001
thanks help.
since java contains log10, have first convert log2. consider definition of change of base 
we can write math.ceil(math.log(256) / math.log(2)) suggested answers... instance, need 9 bits save 256 or 2 bytes:
system.out.println(integer.tobinarystring(256)); int numberbits = (int) math.ceil(math.log(256) / math.log(2)) + 1; int numberbytes = (int) (math.ceil(math.log(256) / math.log(2)) / 8) + 1; system.out.println(numberbits); system.out.println(numberbytes); 100000000 9 2 i intrigued in how byte[] of requirement (to have them in revert order)... started implementation of following test class char[]. then, came mind bitset if need operations on bit set.
import java.io.ioexception; import java.util.arraylist; import java.util.arrays; import java.util.bitset; import java.util.list; public class testrevertbitset { public static class revertablebitset { private bitset bitset; private boolean flipped; private revertablebitset(bitset bitset) { this.bitset = bitset; } public static revertablebitset makenew(char[] bitarray) { bitset bytevalue = new bitset(bitarray.length); (int = 0; < bitarray.length; i++) { if (bitarray[i] == '1') { bytevalue.flip(i); } } revertablebitset r = new revertablebitset(bytevalue); if (r.haszerocardinality()) { r.flipallbitstrue(); } else { r.revertbitsorder(); } return r; } public boolean hasallbitsflip() { return this.flipped; } /** * @return if bits set. */ public boolean haszerocardinality() { return this.bitset.cardinality() == 0; } /** * flips bits given bitset true. */ public void flipallbitstrue() { this.bitset.set(0, this.bitset.size()); this.flipped = true; } /** * reverts bits sequence. instance, 01100 00110. */ public void revertbitsorder() { (int = 0; < 4; i++) { boolean nthbit = this.bitset.get(i); this.bitset.set(i, this.bitset.get(7 - i)); this.bitset.set(7 - i, nthbit); } } /** * @return char array values based on bit indexes of * given bit set. */ public char[] tochararray() { char[] bitchars = new char[8]; (int = 0; < bitchars.length; i++) { bitchars[i] = bitset.get(i) ? '1' : '0'; } return bitchars; } /** * @param bitindex * @return boolean value of given bit index. */ public boolean getbitbooleanatindex(int bitindex) { if (bitindex > 7) { return false; } return this.bitset.get(bitindex); } /** * @param bytesetslist * list of bitset. * @return integer representation of entire bit set. */ public static int convertsettointeger( list<revertablebitset> bytesetslist) { int sum = 0; int index = 0; (revertablebitset bitset : bytesetslist) { if (bitset.hasallbitsflip()) { (int = 0; < 8; i++) { index++; } continue; } (int = 7; >= 0; i--) { int bit = bitset.getbitbooleanatindex(i) ? 1 : 0; int intvalue = (int) math.pow((double) 2, (double) index++) * bit; sum = sum + intvalue; } } return sum; } @override public string tostring() { stringbuilder b = new stringbuilder(); b.append("[ "); (int = 0; < 7; i++) { b.append(i); b.append(" , "); } b.delete(0, b.length() - 2); b.append(" ]"); return b.tostring(); } } public static void main(string[] args) throws ioexception { int decimalnumber = 256; system.out.println("decimal number: " + decimalnumber); system.out.println(integer.tobinarystring(decimalnumber)); int numberbits = (int) math.ceil(math.log(decimalnumber) / math.log(2)) + 1; int numberbytes = (int) (math.ceil(math.log(decimalnumber) / math.log(2)) / 8) + 1; system.out.println("number of bits: " + numberbits); system.out.println("number of bytes: " + numberbytes); list<revertablebitset> bytesset = new arraylist<revertablebitset>(); int bitscounter = -1; char[] binarychars = integer.tobinarystring(decimalnumber) .tochararray(); char[] currentchars = new char[8]; arrays.fill(currentchars, '0'); (int = binarychars.length - 1; >= 0; i--) { if (bitscounter + 1 <= 7) { currentchars[++bitscounter] = binarychars[i]; } else { revertablebitset bitset = revertablebitset .makenew(currentchars); bytesset.add(bitset); bitscounter = -1; arrays.fill(currentchars, '0'); currentchars[++bitscounter] = binarychars[i]; } } bytesset.add(revertablebitset.makenew(currentchars)); system.out.println("------------"); (revertablebitset bitset : bytesset) { system.out.println(arrays.tostring(bitset.tochararray())); } system.out.println("------------"); system.out.println("number: " + revertablebitset.convertsettointeger(bytesset)); } } the output of execution of main method is:
decimal number: 256 100000000 number of bits: 9 number of bytes: 2 ------------ [1, 1, 1, 1, 1, 1, 1, 1] [0, 0, 0, 0, 0, 0, 0, 1] ------------ number: 256 larger numbers work...
decimal number: 33456176 1111111101000000000110000 number of bits: 26 number of bytes: 4 ------------ [0, 0, 1, 1, 0, 0, 0, 0] [1, 0, 0, 0, 0, 0, 0, 0] [1, 1, 1, 1, 1, 1, 1, 0] [0, 0, 0, 0, 0, 0, 0, 1] ------------ number: 33456176
Comments
Post a Comment