不使用四则运算符求和

题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。


思路:
首先分析人民利用十进制是如何做的: 比如5+7=12,分三步走
第一步:相加各位的值,不算进位,得到2。
第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。

第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。

同样我们可以用三步走的方式计算二进制值相加: 5的二进制101,7的二进制111 
第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111。

第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1。

第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。
     继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果。
class Solution {
public:
    int Add(int num1, int num2)
    {
       int sum,carry;
        while(num2!=0)
        {
            
            sum=num1^num2;//第一步,只做各位相加不进位,即异或运算
            
            carry=(num1&num2)<<1;//当1+1时存在进位,想象成两数先做and运算,再向左移动一位,等于0时则不存在进位
            
            num1=sum;
            num2=carry;
                
        }
        return num1;
    }
};

 

<think>嗯,用户问的是如何在Java中使用位运算来实现两个八进制数的求和。首先,我需要确认用户的需求。八进制数在Java中通常以0开头表示,比如012表示十进制的10。但用户可能希望输入的是字串形式的八进制数,比如"123""456",然后进行相加,结果还是八进制。或者,用户可能已经将八进制数转换为整数,然后进行运算,但希望用位操作来处理。 接下来,我需要考虑如何用位运算来模拟加法。通常,加法可以通过位运算中的异或、移位来实现。基本思路是:进位的加法用异或,进位用运算然后左移一位,循环直到进位为0。 但是,这里的问题是八进制数的处理。八进制数在内存中其实是以二进制存储的,所以如果用户已经将八进制字串转换为整数,那么直接进行位运算即可。但八进制的每一位是0-7,而Java的整数是二进制的,所以可能需要先处理字串中的每个八进制位,转换为二进制后进行运算,或者直接利用十进制的加法,然后转回八进制。 过用户明确要求使用位运算,所以可能需要先将八进制数转换为二进制(整数),然后用位运算进行加法,再将结果转回八进制。 可能的步骤: 1. 将两个八进制字串转换为十进制整数。 2. 使用位运算实现这两个整数的加法。 3. 将结果转换回八进制字串。 但是,问题在于,如果用户希望直接处理八进制数的每一位,比如逐位相加,使用位运算的话,可能需要更底层的操作。例如,将每个八进制数的每一位转换为3位二进制,然后逐位处理,但这样会比较复杂。 或者,用户可能误解了位运算的用途,其实Java中的位运算是基于二进制补码的,所以直接处理十进制的加法,然后转换为八进制即可,但用户坚持要用位运算实现加法过程,而是直接用+运算。 因此,核心问题是如何用位运算实现两个整数的加法,而这两个整数原本是八进制数。例如,用户可能输入的是八进制的数字,但已经转换为int类型,比如int a = 012(即十进制的10),int b = 013(即十进制的11),然后想用位运算求它们的,结果转回八进制。 所以,首先需要将两个八进制数转换为十进制整数,然后使用位运算进行加法,再将结果转换为八进制输出。 那如何用位运算实现加法呢?已知的方法是: sum = a ^ b; // 进位的加法 carry = (a & b) << 1; // 进位 然后循环,直到carry为0,把sumcarry相加,直到没有进位为止。 这个过程需要用循环,直到进位为0。例如: int add(int a, int b) { while (b != 0) { int sum = a ^ b; int carry = (a & b) << 1; a = sum; b = carry; } return a; } 这样,这个函数用位运算实现了加法。那用户的问题就可以分解为: 1. 将输入的八进制字串转换为整数。 2. 使用上述位运算加法函数计算它们的。 3. 将结果转换为八进制字串。 接下来需要处理八进制转换的问题。Java中,Integer.parseInt(octStr, 8)可以将八进制字串转为整数。例如,"12"转为十进制的10。然后,用上述加法函数得到结果后,用Integer.toOctalString(result)转回八进制。 所以,整体步骤应该是这样的: 用户输入两个八进制字串,比如s1s2,转换为十进制的int aint b。然后使用位运算加法得到sum,再将sum转为八进制字串。 但需要注意可能的溢出问题,比如当两个数相加超过Integer.MAX_VALUE时,但这里假设用户处理的是正常范围内的数。 现在,编写代码示例: public class OctalAddition { public static void main(String[] args) { String octal1 = "12"; // 对应十进制10 String octal2 = "13"; // 对应十进制11 int a = Integer.parseInt(octal1, 8); int b = Integer.parseInt(octal2, 8); int sum = addUsingBitwise(a, b); System.out.println("Sum in octal: " + Integer.toOctalString(sum)); } private static int addUsingBitwise(int a, int b) { while (b != 0) { int sumWithoutCarry = a ^ b; int carry = (a & b) << 1; a = sumWithoutCarry; b = carry; } return a; } } 这样,输出应该是八进制的23(10+11=21,十进制21转八进制是25?哦,等一下,这里可能有计算错误。10+11=21,21的八进制是25吗? 计算一下:8^2=64,21/8=2余5,所以是25。所以输出是25。 但假设用户输入的是八进制的1213,即十进制的1011,为21,转八进制为25。所以代码正确。 但是,用户的问题是“最好使用位运算实现”,所以这里的加法函数确实使用了位运算,而没有使用+号,合要求。 总结步骤: 1. 将两个八进制字串转换为十进制整数。 2. 使用位运算实现加法。 3. 将结果转回八进制。 需要注意的是,如果用户输入的八进制数带有前导0,比如直接写int a = 012,这在Java中是允许的,但需要注意,从Java 7开始,八进制字面量以0开头,但如果是字串的话需要用Integer.parseInt处理。 可能的疑问:用户是否希望直接处理八进制数的每一位,而是转换为十进制?例如,像大数运算一样处理每一位的八进制位,用位运算处理进位。但这样的话,实现起来会更复杂,因为每个八进制位是3位二进制,可能需要更细致的操作。但通常来说,转换为十进制整数再处理更简单,而用户的问题可能更倾向于这种方法。 所以,我认为上述方法是可行的。用户可能需要的是一种使用位运算来替代普通加法的方法,而这里的addUsingBitwise函数正是这样做的。所以回答应该包括这些步骤代码示例。</think>在Java中,若要用位运算实现两个八进制数的求和,可按以下步骤操作: --- ### **步骤分析** 1. **八进制转十进制** 将输入的八进制字串(如`"12"`)通过`Integer.parseInt(octalStr, 8)`转为十进制整数,如`"12"`转为`10`。 2. **位运算实现加法** 用异或(`^`)计算进位的,用(`&`)+左移(`<<`)计算进位,循环直到进位为0: ```java int add(int a, int b) { while (b != 0) { int sum = a ^ b; // 进位的 int carry = (a & b) << 1; // 进位 a = sum; b = carry; } return a; } ``` 3. **结果转回八进制** 使用`Integer.toOctalString(result)`将十进制转为八进制字串。 --- ### **完整代码示例** ```java public class OctalBitwiseAddition { public static void main(String[] args) { String octal1 = "12"; // 十进制 10 String octal2 = "13"; // 十进制 11 // 八进制转十进制 int num1 = Integer.parseInt(octal1, 8); int num2 = Integer.parseInt(octal2, 8); // 位运算求和 int sum = addUsingBitwise(num1, num2); // 十进制结果转八进制 System.out.println("八进制: " + Integer.toOctalString(sum)); // 输出 25(十进制 21) } // 位运算实现加法 private static int addUsingBitwise(int a, int b) { while (b != 0) { int sumWithoutCarry = a ^ b; int carry = (a & b) << 1; a = sumWithoutCarry; b = carry; } return a; } } ``` --- ### **关键点** - **位运算加法逻辑** - `a ^ b`:计算无进位(如`10 ^ 11 = 01`)。 - `(a & b) << 1`:计算进位(如`10 & 11 = 10`,左移得`100`)。 - 循环直到进位为0。 - **八进制转换** Java内置方法`Integer.parseInt(octalStr, 8)``Integer.toOctalString()`简化了进制转换。 --- ### **注意事项** - **输入合法性** 需确保输入的八进制字串合法(仅含`0-7`)。 - **溢出问题** 若结果超过`Integer.MAX_VALUE`,需改用`long`或`BigInteger`。 通过这种方法,既能利用位运算实现底层加法,又能通过Java标准库处理进制转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值