【题目链接】
题解
- 不用加减乘除做加法(位运算,清晰图解)
思路
代码
classSolution:''' 在计算机系统中,数值一律用补码来表示和存储。因为使用补码,可以将符号位和数值域统一处理,且加法和减法也可以统一处理! 1.原码求补码: 正整数的补码是其二进制表示,与原码相同 负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1 2.补码求原码: 正整数的补码就是原码 负整数的补码的补码是原码 '''### 1206 位运算(36 ms,13.5 MB)defadd(self,a:int,b:int)->int:# 十六进制数 0xffffffff = 1111 1111 1111 1111 1111 1111 1111 1111 = 4294967295x=0xffffffff# 循环迭代后:a表示当前无进位的总和,b表示总的进位# 获取负数的补码:将数字与十六进制数 0xffffffff 相与。可理解为舍去此数字 32 位以上的数字(将 32 位以上都变为 0),从无限长度变为一个 32 位整数a,b=a&x,b&x# 当进位b中还有进位1时(不为0),表示和还未加完,需要继续用位运算来表示相加whileb:# 异或^:表示相加,与运算&结合左移<<:表示计算进位(注意:位运算优先级比逻辑运算高!)a,b=a^b,(a&b)<<1&x# 十六进制数 0x7fffffff = 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647,表示正的最大有符号数(0表示正)# 若a > 0x7fffffff,则表示a为负数(在Python中是使用补码表示负数),因此需要将此补码还原为负数的原码# a ^ x 运算将 1 至 32 位按位取反; ~ 运算是将整个数字取反;因此, ~(a ^ x) 是将 32 位以上的位取反,1 至 32 位不变returnaifa<=0x7fffffffelse~(a^x)