我需要实现一个函数,它使用java将值分解为2的幂。
例如:14 = 8 + 4 + 2
我需要找到值被分解的两个幂。对于上面的例子,我需要2,3,1作为输出。我怎么能实现呢?
答案 0 :(得分:9)
利用Java使用的二进制表示。我不知道你希望2的幂能采用什么形式,但是你可以通过移位和逐位&
和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;
}
答案 1 :(得分:7)
由于整数已经表示为2的幂,而Java具有一组位的集合,我将使用这两个。
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}
答案 2 :(得分:2)
为此,您通常使用逐位操作,即shift(&lt;&lt;&gt;&gt;,&gt;&gt;&gt;&gt;)和bit-wise和(&amp;)运算符,因为内部计算机中整数的表示已经是二进制的,这就是你所需要的。
在二进制表示中,每个整数值是2:1,2,4,8,16,32 ......的幂的组合。
因此,十进制中的14是二进制1110:8 + 4 + 2 + 0。
如果您正在使用一些不错的通用算法,您可能希望开始将十进制数分解为10的幂,并从那里将您的解决方案扩展到其他基础,例如2。
答案 3 :(得分: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);
}