整数の四則演算を+-*/を使わずに実装する

+-*/が使えない不測の環境に備えてこれらを実装してみる

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;
    }
}

がんばればビット演算だけでいける。

加算が一番むずい。電子回路学んだことがあれば分かるね