public static int getNearestPowerOfTwoFromBinary(int n){ /*Convert the number in the binary value then take the first 1 since left: the result is the length from the right of the number, or the power in decimal*/ String binary = Long.toBinaryString(n); int power = binary.length() - binary.indexOf("1"); return Math.pow(2, power); }
There is also another way to calculate the nearest power-of-two number, as the following:
public static int getNearestPowerOfTwo(int n){ //get the power of 2 from n double powerSinceTwo = Math.log(signal.length)/Math.log(2); /*if the number is integer than return the number, else return a number with the power + 1*/ if(powerSinceTwo != Math.floor(powerSinceTwo){ int power = Math.floor(powerSinceTwo) + 1; return Math.pow(2, power); } return n; }Why we should find the nearest power of 2 from a number? There are a lot of answers.
Mine is that I needed to use this for a FFT with the Apache Commons Math, because sometimes my signals came with a non-power-of-2 length. Also for JTransforms is usefull to have a full power-of-two signal length to use the multithreaded speed.
But, how to use them to get an array with a power of two length?
public static Object[] getArrayWithPoTLength(Object[] array){ int newLength = getNearestPowerOfTwo(array.length); Object[] newArray; if(array.length != newLength){ newArray = new Object[newLength]; for(int i=0; i < newLength ; i++){ if(i < array.length) newArray[i] = array[i]; else newArray[i] = new Object(); } return newArray; } return array; }
So, that's all for the first post.
And before you leave, please leave a comment if it was useful or a suggestion to correct something.
Some useful links about: http://www.thatsjava.com/java-programming/253675/
15/03/2012 - Update
Want more? Did you know bitshift operators in Java?
They will give a quick way to find a solution for the problem of this post:
public static int getNearestPowerOfTwoWithShifts(int x){ // return X if it is a power of 2 if ((x & (x-1)) == 0 ) return x; // integers in java are represented in 32 bits, so: for(int i=1; i<32; i = i*2){
x |= ( x >>> i);
}
return x + 1; }
So, what's this stuff?
In the first parts your doing a bitwise between X and X-1, so if X is a power of 2, for example 32 its representation in the binary format will be something like:
And X-1 will be something like:100000
Using the bitwise operator & (AND) the result will be 0.011111
Otherwise, if we take a non power of 2 number, for example 49 its representation in the binary format is:
And X-1, in the exampe 49 - 1 = 48, is:110001
So the bitwise result will be something different from 0:110000
We still need to find the nearest power of 2, starting from our X number. Using shift operators in Java we can find them in this way:110001 AND 110000 = 110000
Take the number and use the OR operator with shifts, starting with shifting 1 position to all 32 positions...
48 shifted by 1 give back 52.
52 shifted by 2 give back 63.
... and so on until shifting by 32.
Shift by 1: 110001 OR 011000 = 111001
Shift by 2: 111001 OR 001110 = 111111
Now add 1 to this number to obtain a power of 2 number.
Nessun commento:
Posta un commento