加减乘除的位运算写法

public class Test73 {
    // 使用位运算实现两个整数的加法
    public static int add(int a, int b){
        int ans = a; // 初始化结果为a
        while(b != 0) { // 当b不为0时,继续执行循环
            ans = a^b; // 异或操作,得到不考虑进位的结果
            b = (a & b) << 1; // 与操作后左移一位,得到进位值
            a = ans; // 更新a为不考虑进位的结果
        }

        return ans; // 返回最终结果
    }

    // 实现两个整数的减法,通过调用add方法实现
    public static int minus(int a, int b) {
        return add(a, neg(b)); // 将b取反后相加,相当于a减去b
    }

    // 实现一个整数的取反操作
    public static int neg(int n){
        return add(~n , 1); // 对n进行按位取反,然后加1得到其相反数
    }

    // 使用位运算实现两个整数的乘法
    public static int multiply(int a, int b) {
        int ans = 0; // 初始化结果为0
        while(b != 0) { // 当b不为0时,继续执行循环
            if((b & 1) != 0) { // 如果b是奇数,则将a累加到结果中
                ans = add(ans, a);
            }
            a <<= 1; // a左移一位,相当于乘以2
            b >>>= 1; // b无符号右移一位,相当于除以2
        }
        return ans; // 返回最终结果
    }

    // 定义整数最小值常量
    public static int MIN = Integer.MIN_VALUE;

    // 实现两个整数的除法
    public static int divide(int a, int b) {
        if (a == MIN && b == MIN) {
            // a和b都是整数最小,返回1作为结果
            return 1;
        }
        if (a != MIN && b != MIN) {
            // a和b都不是整数最小,那么正常去除
            return div(a, b);
        }
        if (b == MIN) {
            // a不是整数最小,b是整数最小,返回0作为结果
            return 0;
        }
        // a是整数最小,b是-1,返回整数最大,因为题目里明确这么说了
        if (b == neg(1)) {
            return Integer.MAX_VALUE;
        }
        // a是整数最小,b不是整数最小,b也不是-1
        a = add(a, b > 0 ? b : neg(b)); // 先将a加上b的绝对值
        int ans = div(a, b); // 计算新的a除以b的结果
        int offset = b > 0 ? neg(1) : 1; // 根据b的正负确定偏移量
        return add(ans, offset); // 返回最终结果加上偏移量
    }

    // 必须保证a和b都不是整数最小值,返回a除以b的结果
    public static int div(int a, int b) {
        int x = a < 0 ? neg(a) : a; // 取a的绝对值
        int y = b < 0 ? neg(b) : b; // 取b的绝对值
        int ans = 0; // 初始化结果为0
        for (int i = 30; i >= 0; i = minus(i, 1)) { // 从高位开始遍历
            if ((x >> i) >= y) { // 如果当前位大于等于y
                ans |= (1 << i); // 将对应位设为1
                x = minus(x, y << i); // 减去y左移i位的值
            }
        }
        return a < 0 ^ b < 0 ? neg(ans) : ans; // 根据a和b的正负情况决定是否取反
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值