
LintCode A + B Problem
发布日期:2025-04-05 17:00:14
浏览次数:8
分类:精选文章
本文共 857 字,大约阅读时间需要 2 分钟。
不让用数学运算符,就用位运算符。这种方法在计算机科学中常见于低级语言和硬件设计。通过逐位异或和携带值的方式,我们可以实现加法,没有使用任何算术运算符。
背景知识
在二进制计算中,加法可以通过异或操作来进行,部分结果由异或决定,而关键的部分则由携带值决定。当两个数在同一位上为1时,结果位为0,并产生一个1的携带值到高位。接下来的问题是该携带值如何被处理。
方法分析
我们将每一位的计算分解为三个步骤:
计算当前位的结果:res的当前位由与a和b对应位的异或操作和携带值决定。
更新携带值:如果a或b的当前位是1,或者携带值本身为1,那么新的携带值为1;否则,携带值为0。
实现代码
可参考以下Java实现:
public class Solution { public int aplusb(int a, int b) { int res = 0; int carry = 0; for(int i = 0; i < 32; i++){ int aCur = (a >> i) & 1; int bCur = (b >> i) & 1; res |= (aCur ^ bCur ^ carry) << i; if((aCur == 1 && bCur == 1) || (aCur == 1 || bCur == 1) && carry == 1){ carry = 1; } else { carry = 0; } } return res; }}
优点
- 常数时间复杂度:由于只执行32次循环,每个循环都处理一位二进制数,总时间复杂度为O(1)。空间复杂度同样为O(1)。
这种方法无需使用任何算术运算符,仅通过位操作和逻辑判断实现加法。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年05月06日 16时50分34秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LeetCode136.只出现一次的数字[异或运算典例]
2025-04-05
LeetCode13:罗马数字转整数
2025-04-05
leetcode191-打家劫舍
2025-04-05
leetcode23-合并K个升序链表
2025-04-05
leetcode231 判断一个给定的整数是否是2的n次幂
2025-04-05
leetcode238-除自身以外数组的乘积
2025-04-05
LeetCode268.缺失数字
2025-04-05
LeetCode331.验证二叉树的前序序列化
2025-04-05
Leetcode: Spiral Matrix II
2025-04-05
LeetCode: String to Integer (atoi)
2025-04-05
Leetcode:454. 4Sum II
2025-04-05
LeetCode:Restore IP Addresses
2025-04-05
LeetCode——Unique Paths
2025-04-05
LeetCode二叉树从上至下路径问题总结(112.113.437.129)
2025-04-05
LeetCode哈希表+字符类的题目总结
2025-04-05
LeetCode地平线专场——第308场周赛题解
2025-04-05
LeetCode数据库题目汇总二(附答案)
2025-04-05
LeetCode新手指南:从零开始掌握算法挑战
2025-04-05