java - Number of bytes to encode a number -


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 enter image description here

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