371SumofTwoIntegers

本文介绍了一种不使用加号和减号实现两数相加的方法。通过位运算中的异或和与操作来分别处理无需进位的部分和其他部分,巧妙地实现了加法的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:输入两个数a和b,输出二者之和,要求不使用“+”和“-”

思路:计算机中的负数使用补码表示(绝对值表示,按位求反,末位加1)

             按位运算(数字逻辑设计)1 op 1 = 1 0; 1 op 0 = 1; 0 op 1; 0 op 0 = 0

            异或:无需进位的位(其他)“^”

            与: 需要进位的位(第一种)"&"

           或:“|”

           非:“!”

    public int getSum(int a, int b) {
        int carry;
        while(a != 0){
            carry = a & b; 
            b = a ^ b;
            a = carry << 1;
        }
        return b;
    } //iterative
    
        public int getSum(int a, int b) {
    	int res, res1, res2;
    	/*
    	 * Integer.MAX_VALUE Integer.MIN_VALUE
    	 */
    	if(a == 0) return b;
    	else return getSum((a&b)<<1, a^b);
    } //recursive
    
      //alighment: little-endian
    public static byte[] conv(int x){
    	byte res[] = new byte[4];
   		int offset = 0;
    	for(int i = 0; i < 4; i++ ){
    		res[i] = (byte)((x >> offset) & 0xff);
    		offset += 8;
    	}
    	return res;
    }
    
    public static int conv(byte[] x){
    	if(x.length != 4) return -1;
    	int res = 0;
    	int offset = 0;
    	for(int i = 0; i < x.length; i++){
    		res += (x[i] & 0xff) << offset;
    		offset += 8;
    	}
    	return res;
    }
    
    //unit test
    public static void main(String args[]) throws FileNotFoundException{
    	int arr[];
    	String st[];
    	arr = new int[2];
    	/*
    	int x1;
    	byte bt[] = conv(x);
    	System.out.println(bt[0] + " " + bt[1] + " " + bt[2] + " " + bt[3]);
    	x1 = conv(bt);
    	System.out.println(x1);
    	*/
    	Scanner sc = new Scanner(new File("test.txt"));
    	while(sc.hasNextLine()){
    		 st = sc.nextLine().split(" ");
    		 for(int i = 0; i < st.length; i++) {
    			 //st.length == 2
    			 arr[i] = Integer.parseInt(st[i]);
    			 System.out.print(arr[i] + " ");
    		 }
    		 getSum(arr[0], arr[1]);
    		 System.out.println(getSum(arr[0], arr[1]));
    		 System.out.println("***************************");
    	}
    	sc.close();
    }





             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值