加减乘除的位运算写法

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的正负情况决定是否取反
    }
}

在使用BigDecimal进行加减运算时,可以使用add方法进行加法运算,subtract方法进行减法运算。例如,如果有两个BigDecimal对象num1和num2,可以使用以下代码进行加减运算: 加法运算: BigDecimal result1 = num1.add(num2); 减法运算: BigDecimal result2 = num1.subtract(num2); 需要注意的是,当使用new BigDecimal(double val)创建BigDecimal对象时,可能会存在精度问题。为了避免这种情况,可以使用setScale方法设置需要保留的小数位数和进位方式。例如,如果需要保留两位小数,可以使用以下代码: BigDecimal result = num.setScale(2, BigDecimal.ROUND_HALF_UP); 对于除法运算,无论参数是double类型的还是除不尽的情况,都需要进行格式化,否则可能会报Non-terminating decimal expansion; no exact representable decimal result异常。除法运算的写法与加减运算略有不同。例如,如果有两个BigDecimal对象num1和num2,可以使用以下代码进行除法运算: BigDecimal result = num1.divide(num2, 20, BigDecimal.ROUND_HALF_UP); 其中,第一个参数是除数,第二个参数是保留的小数位数,第三个参数是进位方式。在这个例子中,保留了20位小数,并使用四舍五入的方式进行进位。 #### 引用[.reference_title] - *1* *2* [BigDecimal加减乘除计算](https://blog.csdn.net/haiyinshushe/article/details/82721234)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [BigDecimal加减乘除运算及注意事项](https://blog.csdn.net/worshipme/article/details/106269190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值