题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路:
- 相加各位的值,不算进位,二进制每位相加就相当于各位做异或操作,即 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
- 正整数的原码、反码和补码都一样;