public class HalvingSum {
public int halvingSum(final int n) {
int sum = n;
int i = 2;
while (n / i != 0) {
sum += n / i;
i *= 2; // or: <<= 1
}
return sum;
}
public int halvingSum_B(final int n) {
int sum = 0;
int n1 = n;
while (n1 != 0) {
sum += n1;
n1 /= 2; // or: >>>= 1 if n1 is not negative
}
return sum;
}
public static void main(String[] args) {
HalvingSum s = new HalvingSum();
System.out.println(s.halvingSum(25)); // => 47
System.out.println(s.halvingSum_B(25)); // => 47
for (int i = -10; i < 10; i++) {
System.out.println(i + " " + s.halvingSum(i) + " " + s.halvingSum_B(i));
}
}
}
halvingSum_B
stellt eine Optimierung von halvingSum
dar (in einer Schleife sind zwei Rechenoperationen weniger). Ich verstehe nicht, wie man zu dieser Transformation gelangt… Habt ihr da einen Tipp für mich? Vielen Dank.