题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路:
- 相加各位的值,不算进位,二进制每位相加就相当于各位做异或操作,即 a ^ b ;
- 计算进位值,相当于各位做与操作,再向左移一位,,即 (a & b) << 1。
- 重复上述两步, 各位相加 ,计算进位值。进位值为0,跳出循环
# -*- coding:utf-8 -*-
class Solution:
def add(self, a: int, b: int) -> int:
if b == 0:
return a;
return add(a ^ b, (a & b) << 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
- 正整数的原码、反码和补码都一样;