不用加减乘除做加法(剑指offer 65)Java位运算

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

一、题目描述



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


示例:

输入: a = 1, b = 1

输出: 2

 

提示:

a, b 均可能是负数或 0

结果不会溢出 32 位整数


二、思路讲解



题目要求不能使用加减乘除的符号,那么我最先想到的是调用方法:

return Integer.sum(a, b);


虽然也能通过,但这显然是投机取巧,不是这道题真正想要考察的东西。


言归正传,既然题目要求不能使用四则运算符号,那我们就很自然地想到使用位运算的符号。由组成原理的知识可得:两个无符号数相加,本质上是非进位和+进位,非进位和=a^b,进位和=(a&b) << 1,并且循环这个过程,直到进位为0,此时非进位和就是两数之和。


如果遇到负数怎么办?其实CPU中只有加法器,负数是以补码的形式参与计算的,因此无需考虑正负。


三、Java代码实现



class Solution {
    public int add(int a, int b) {
        //加法其实可以看作 进位+非进位和 
        while(b!=0){    //直到进位为0,那么非进位和就是两数之和
            int c = (a&b) << 1; //c是进位
            a = a^b;    //计算非进位和
            b = c;      //保留进位
        }
        return a;
    }
}


四、时空复杂度分析


     

时间复杂度:        O(1)           最差情况下(例如 a =a= 0x7fffffff , b = 1b=1 时),需循环 32 次,使用 O(1) 时间;每轮中的常数次位操作使用 O(1) 时间。


空间复杂度:        O(1)


相关文章
|
4月前
|
编解码 算法 Java
Java中的位运算详解
Java中的位运算详解
|
5月前
|
Java
在Java中,你可以创建一个简单的四则运算程序来执行小学级别的加减乘除操作
【6月更文挑战第19天】Java程序实现简单四则运算,接收用户输入的两个数字和运算符,根据运算符调用相应函数进行计算。包含加、减、乘、除功能,其中除法操作检查了除数是否为零,避免运行时错误。
53 5
|
5月前
|
Java
Java中的左移运算符及其在实现加法效果上的应用
Java中的左移运算符及其在实现加法效果上的应用
|
5月前
|
Java
剑指offer_3_前n个数字二进制形式中1的个数(java)
剑指offer_3_前n个数字二进制形式中1的个数(java)
|
5月前
|
Java
剑指offer_2_二进制加法(java)
剑指offer_2_二进制加法(java)
|
5月前
|
Java
剑指offer_1_整数除法(java)
剑指offer_1_整数除法(java)
|
5月前
|
算法 Java
Java数据结构与算法:位运算之位移操作
Java数据结构与算法:位运算之位移操作
|
5月前
|
算法 Java
Java数据结构与算法:位运算之与、或、异或运算
Java数据结构与算法:位运算之与、或、异或运算
|
6月前
|
Java 程序员 数据安全/隐私保护
Java中的位运算
Java中的位运算
43 0
|
6月前
|
存储 安全 Java
剑指offer全集系列Java版本(2)
剑指offer全集系列Java版本(2)
36 0