Javaを使用して値を2の累乗に分解する関数を実装する必要があります。
例:14 = 8 + 4 + 2
値が分解される2の累乗を見つける必要があります。上記の例では、出力として2,3,1が必要です。どうすればそれを実装できますか?
Javaを使用して値を2の累乗に分解する関数を実装する必要があります。
例:14 = 8 + 4 + 2
値が分解される2の累乗を見つける必要があります。上記の例では、出力として2,3,1が必要です。どうすればそれを実装できますか?
Javaが使用するバイナリ表現を利用します。2の累乗をどのような形式にするかはわかりませんが、1をシフトしてビット単位&
でビットごとにループし、各ビットをテストすることで、ビットを1つずつループできます。各1ビットは、合計で2の累乗を表します。
例えば:
List<Integer> powers = new ArrayList<Integer>();
n = . . .; // something > 0
int power = 0;
while (n != 0) {
if ((n & 1) != 0) {
powers.add(1 << power);
// or, if you just need the exponents:
// powers.add(power);
}
++power;
n >>>= 1;
}
整数はすでに2の累乗として表されており、Javaにはビットのセットのコレクションがあるため、これら2つを使用します。
public static void main(String[] args) {
System.out.println(bitsSet(14));
}
public static BitSet bitsSet(long num) {
BitSet bitSet = new BitSet();
for (int i = 0; i < 64; i++)
if (((num >>> i) & 1) != 0)
bitSet.set(i);
return bitSet;
}
プリント
{1, 2, 3}
このために、通常、ビット単位の演算、つまりシフト(<<、>>、>>>)とビット単位のand(&)演算子を使用します。これは、コンピューターの整数の内部表現がすでに2進数であるためです。何が必要。
2進表現では、各整数値は2:1、2、4、8、16、32、...の累乗の合成です。
したがって、10進数の14は2進数の1110になります:8 + 4 + 2+0。
優れた一般的なアルゴリズムが必要な場合は、10進数を10の累乗に分解し、そこからソリューションを2などの他の基数に拡張することをお勧めします。
値から2を引くだけで、後続のより高い累乗を引き続けることができます。
int x = 0;
int value = args[0];
for (i=0, (value - Math.pow(2, i)) >= 0, i++) {
value = value - Math.pow(2, i);
x++;
}
for (i=0, i<x, i++) {
System.out.println("addent: " + Math.pow(2, i);
}