剑指offer - 不用加减乘除做加法 - python

题目描述

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

思路:

  • 相加各位的值,不算进位,二进制每位相加就相当于各位做异或操作,即 a ^ b
  • 计算进位值,相当于各位做与操作,再向左移一位,,即 (a & b) >> 1
  • 重复上述两步, 各位相加 ,计算进位值。进位值为0,跳出循环

# -*- coding:utf-8 -*-
class Solution: 
    def Add(self, num1, num2):
        # write code here
        while num2 != 0:
            sums = num1 ^ num2
            num2 = (num1&num2)<<1 # 进位
            num1 = sums & ((1<<32) - 1) # 考虑负数
            
        return num1 if num1 <=((1<<31) - 1)  else ~(num1^((1<<32) - 1) )

位运算符可分为:

  • 位逻辑运算符:
    • & :与
    • |:或
    • ^:异或
    • ~:取反
  • 位移运算符
    • <<:左移
    • >>:右移
    • >>>:无符号右移
print (12 & 8) # 8
print (12 | 8) # 12
print(12 ^ 8) # 4
print (~12) # -13
print (12 >> 1) # 6
print (12 << 1) # 24

所有正整数的按位取反是其本身+1的负数

print (~8) # -9

所有负整数的按位取反是其本身+1的绝对值

print (~-8) # 7

零的按位取反是 -1

print(~0) # -1
  • 原码和反码的相互转换:符号位不变,数值位按位取反
  • 原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1
  • 已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1
  • 正整数的原码、反码和补码都一样;
发布了448 篇原创文章 · 获赞 122 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/105348118