---
title: 整数の四則演算を＋－＊／を使わずに実装する
tags: []
categories: ["Programming", "Algorithm", "ArithmethicOperation"]
date: 2011-08-07T16:18:34Z
updated: 2011-08-07T16:18:34Z
---

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


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


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

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