整数の四則演算を+-*/を使わずに実装する
+-*/が使えない不測の環境に備えてこれらを実装してみる
public class ArithmeticOperations {
/**
* 加算
*/
public static int add(int a, int b) {
if (b == 0)
return a;
int s = a ^ b; // 半加算
int c = (a & b) << 1; // 繰り上げ
return add(s, c);
}
/**
* 反転
*/
public static int negate(int a) {
int x = a;
int n = 0;
int d = a > 0 ? -1 : 1;
while (x != 0) {
x = add(x, d);
n = add(n, d);
}
return n;
}
/**
* 絶対値
*/
public static int abs(int a) {
return a < 0 ? negate(a) : a;
}
/**
* 減算
*/
public static int minus(int a, int b) {
return add(a, negate(b));
}
/**
* 乗算
*/
public static int times(int a, int b) {
int d = b < 0 ? negate(a) : a;
int t = 0;
for (int i = 0; i < abs(b); i = add(i, 1)) {
t = add(t, d);
}
return t;
}
/**
* 除算
*/
public static int divide(int a, int b) {
if (b == 0)
throw new ArithmeticException("b is 0!!");
int d = 0;
int bb = abs(b);
for (int i = abs(a); i >= bb; i = minus(i, bb)) {
d = add(d, 1);
}
return (a > 0 && b < 0) || (a < 0 && b > 0) ? negate(d) : d;
}
}
がんばればビット演算だけでいける。
加算が一番むずい。電子回路学んだことがあれば分かるね