不使用+或-运算符,计算两数之和

简介: 不使用+或-运算符,计算两数之和

引言

标在我们为了提升自身编程能力刷题时,总会总会遇到一些奇怪的要求,如:不使用+-运算符计算两数之和。

今天我们就可以通过位运算来解决这个问题。


问题描述

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

示例一:

输入:a = 1, b = 2

输出:3

示例二:

输入:a = 2, b = 3

输出:5


算法描述

因为题目要求不可以使用+-运算符。所以我们就可以使用位运算,首先了解位运算基础:

1&(与)如果两个相应的二进制位都为1,则该位的结果值为1,否则为0

2|(或)两个相应的二进制位中只要有一个为1,该位的结果值为1

3^(异或)若参加运算的两个二进制位值相同则为0,否则为1

4~(取反)~是一元运算符,用来对一个二进制数按位取反,即将01,将1

5<<(左移)用来将一个数的各二进制位全部左移N位,右补0>>(右移)将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数, 高位补0

通过了解到位运算的基础知识,我们可以:

1)用^(异或运算)得到同位不同值的相加;

2)然后再循环使用&(与运算)<<(左移)得到同位加相加的值,用与运算得到需要进位的值,然后通过左移运算进位(当a&b不为0时,对应位异或结果变为0,但是相当于两个1加在一起要进位,所以(a&b)<<1求得所有进位的1,再进行异或,直到不存在进位为止。)

注:在 Python 的实现中,因为 Python 的整数类型为是无限长的,所以无论怎样左移位都不会溢出。因此,我们需要对Python 中的整数进行额外处理,以模拟用补码表示的 32 位有符号整数类型。具体地,我们将整数对 2^32取模,从而使第 33 位及更高位均为 00


结语

通过灵活使用异或运算和与运算以及循环完成,不使用+-运算符,计算两数相加。


代码清单

不使用+-运算符,计算两数之和

Courier New字体,23磅行间距

a, b = 3, 4

max1 = 1023

 

 

def int_overflow(val):

    if not -max1 - 1 <= val <= max1:

        val = (val + (max1 + 1)) % (2 * (max1 + 1)) - max1 - 1

    return val

 

 

while b:

    a, b = int_overflow(a ^ b), int_overflow((a & b) << 1)

    print(a)




目录
相关文章
|
7月前
|
存储 C++
两数相加(C++)
两数相加(C++)
49 0
|
7月前
|
存储 程序员 C语言
利用循环结构实现数字的阶乘计算
利用循环结构实现数字的阶乘计算
84 0
wustojc2002整数四则运算
wustojc2002整数四则运算
67 0
|
算法 程序员 C语言
C语言基础(有关三个数比较大小、冒泡排序、最大公约数、和有关某个数x的绝对值的n次方除于n的阶乘问题的函数求解法;和阶乘函数递归方法;和数组作函数参数的
C语言基础(有关三个数比较大小、冒泡排序、最大公约数、和有关某个数x的绝对值的n次方除于n的阶乘问题的函数求解法;和阶乘函数递归方法;和数组作函数参数的
求实数的整数次幂(循环版)(高效)(位运算解题)
说明:参数 x 为底数,n 为指数。若参数正确,则函数值为 x 的 n 次幂。若参数不正确(当底数为 0 且指数为 0 或负数时无意义),则报告错误,函数值为0。// 这个位运算是大部分都不熟悉也不敢用的东西,但是确实是编程里面的一个非常重要的工具。请编写函数,用循环语句以最快的方法求任意实数的任意整数次幂。要求:不得调用 pow 函数,不得使用递归方法。指数 二进制 公式。
231 0
求实数的整数次幂(循环版)(高效)(位运算解题)
|
存储 Rust 算法
两数相加
两数相加
167 0
两数相加
11:计算浮点数相除的余数
11:计算浮点数相除的余数
302 0
力扣题 两数相除:画图解析 采用递归计算除法(不使用乘法、除法和 mod 运算符)
这是力扣上的一道题目,难度为中等,两数相除:给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
力扣题 两数相除:画图解析 采用递归计算除法(不使用乘法、除法和 mod 运算符)
两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。 返回被除数 dividend 除以除数 divisor 得到的商。 整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
103 0

热门文章

最新文章