3

Javaを使用して値を2の累乗に分解する関数を実装する必要があります。

例:14 = 8 + 4 + 2

値が分解される2の累乗を見つける必要があります。上記の例では、出力として2,3,1が必要です。どうすればそれを実装できますか?

4

4 に答える 4

9

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;
}
于 2012-11-04T07:41:08.720 に答える
8

整数はすでに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}
于 2012-11-04T07:47:08.837 に答える
2

このために、通常、ビット単位の演算、つまりシフト(<<、>>、>>>)とビット単位のand(&)演算子を使用します。これは、コンピューターの整数の内部表現がすでに2進数であるためです。何が必要。

2進表現では、各整数値は2:1、2、4、8、16、32、...の累乗の合成です。

したがって、10進数の14は2進数の1110になります:8 + 4 + 2+0。

優れた一般的なアルゴリズムが必要な場合は、10進数を10の累乗に分解し、そこからソリューションを2などの他の基数に拡張することをお勧めします。

于 2012-11-04T07:47:21.207 に答える
1

値から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);
}
于 2012-11-04T07:53:45.113 に答える