不使用+或-运算符,计算两数之和
  TEZNKK3IfmPf 2023年11月12日 19 0

引言

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

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

问题描述

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

示例一:

输入:a = 1, b = 2

输出:3

示例二:

输入:a = 2, b = 3

输出:5

算法描述

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

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

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

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

(4)~(取反)~是一元运算符,用来对一个二进制数按位取反,即将0变1,将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)


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月12日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   39   0   0 python开发语言
  TEZNKK3IfmPf   2024年05月31日   28   0   0 python
  TEZNKK3IfmPf   2024年05月31日   31   0   0 python
TEZNKK3IfmPf