371. 两整数之和

题目:

给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和。

示例 1:
输入:a = 1, b = 2
输出:3

示例 2:
输入:a = 2, b = 3
输出:5

提示:
-1000 <= a, b <= 1000

解法:位运算(二进制)

class Solution {  
public:  
    int getSum(int a, int b) {  
        while (b != 0) {  
            // 计算进位  
            int carry = (unsigned int)(a & b) << 1;  
            // 计算无进位的和  
            a = a ^ b;  
            // 将进位加到a上  
            b = carry;  
        }  
        return a;  
    }  
};  

这段代码定义了一个 Solution 类,其中包含一个 getSum 方法,用于计算两个整数的和。该方法使用了位运算的异或(^)与(&) 操作,以及 左移(<<) 操作来计算进位。

  • a ^ b 计算了两个数的无进位和。
  • (unsigned int)(a & b) << 1计算了两个数的进位,并将进位左移一位,因为进位会出现在更高位上。

在 while 循环中,我们持续进行这两个操作,直到没有进位(即 b变为0)为止。最后,返回累加结果 a。


假设 a = 2 且 b = 3,它们的二进制表示(使用4位来简化)如下:

a = 0010 (十进制中的2)  
b = 0011 (十进制中的3)

现在,如果我们只考虑不进位的和,我们可以直接对每一位进行异或操作:

0010  
^ 0011  
------  
  0001 (十进制中的1)

考虑和的计算

0010
0011
-----
0101 (十进制中的5)

这个问题涉及到了二进制中的 异或(XOR)运算。异或运算的特点是:
当两个相应的二进制位相异时,结果为1;相同时,结果为0
给定的两个二进制数是 0101 和 0011。
我们逐位进行异或运算:
第一位(从右边开始数,即最低位):1 XOR 1 = 0
第二位:0 XOR 0 = 0
第三位:1 XOR 1 = 0
第四位:0 XOR 0 = 0
将这四个结果组合起来,我们得到 0110。


过程
在这里插入图片描述
在这里插入图片描述

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1000以内所有各位数字之和为n的正整数为: - 当n = 1时:1, 2, 3, 4, 5, 6, 7, 8, 9 - 当n = 2时:11, 20, 21, 30, 31, 40, 41, 50, 51, 60, 61, 70, 71, 80, 81, 90, 91 - 当n = 3时:101, 110, 111, 120, 121, 130, 131, 140, 141, 150, 151, 160, 161, 170, 171, 180, 181, 190, 191, 200, 201, 210, 211, 220, 221, 230, 231, 240, 241, 250, 251, 260, 261, 270, 271, 280, 281, 290, 291, 300, 301, 310, 311, 320, 321, 330, 331, 340, 341, 350, 351, 360, 361, 370, 371, 380, 381, 390, 391 - 当n = 4时:1001, 1010, 1011, 1020, 1021, 1030, 1031, 1040, 1041, 1050, 1051, 1060, 1061, 1070, 1071, 1080, 1081, 1090, 1091, 1100, 1101, 1110, 1111, 1120, 1121, 1130, 1131, 1140, 1141, 1150, 1151, 1160, 1161, 1170, 1171, 1180, 1181, 1190, 1191, 2000, 2001, 2010, 2011, 2020, 2021, 2030, 2031, 2040, 2041, 2050, 2051, 2060, 2061, 2070, 2071, 2080, 2081, 2090, 2091 - 当n = 5时:10001, 10010, 10011, 10020, 10021, 10030, 10031, 10040, 10041, 10050, 10051, 10060, 10061, 10070, 10071, 10080, 10081, 10090, 10091, 10100, 10101, 10110, 10111, 10120, 10121, 10130, 10131, 10140, 10141, 10150, 10151, 10160, 10161, 10170, 10171, 10180, 10181, 10190, 10191, 11000, 11001, 11010, 11011, 11020, 11021, 11030, 11031, 11040, 11041, 11050, 11051, 11060, 11061, 11070, 11071, 11080, 11081, 11090, 11091 - 当n = 6时:100001, 100010, 100011, 100020, 100021, 100030, 100031, 100040, 100041, 100050, 100051, 100060, 100061, 100070, 100071, 100080, 100081, 100090, 100091, 100100, 100101, 100110, 100111, 100120, 100121, 100130, 100131, 100140, 100141, 100150, 100151, 100160, 100161, 100170, 100171, 100180, 100181, 100190, 100191, 101000, 101001, 101010, 101011, 101020, 101021, 101030, 101031, 101040,这是1000以内所有各位数字之和为n的正整数的列表。每个n对应的列表中都包含了所有各位数字之和为n的正整数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值