zoukankan      html  css  js  c++  java
  • LeetCode:不用加号的加法(位运算)

     解题思路:位运算,只能用位运算符。a、b同号比较好处理。主要是异号的情况,考虑 a>0,b<0,因为 a,b的绝对值都不会超过2^32,因此取模数为2^32。根据同余方程可知 (a+b)%mod = (a+(mod+b))%mod,mod+b即为负数b在mod下的补码:b & int('1'*32,2)。

    如果(a+(mod+b)) > mod说明a+b为正数;否则a+b为负数,如果是负数,~(ans ^ int('1'*32,2)),ans是(a+(mod+b))。

    感觉这道题属于计算机组成原理,计算补码部分也是笔者从其他地方找到的,不知道python是怎么执行的。特此记录本题

     1 class Solution:
     2     def sum(self,a,b):
     3         while b:
     4             z1 = a^b
     5             z2 = (a&b)<<1 #都为1需要进位
     6             a = z1
     7             b = z2
     8         return a
     9     def get_bu(self,x):
    10         # if x<0 :|x|+get_bu(x)==mod
    11         # else :get_bu(x) = x
    12         return x&int('1'*32,2)
    13 
    14     def add(self, a: int, b: int) -> int:
    15         if a>=0 and b>=0:
    16             return self.sum(a,b)
    17         elif a<0 and b<0:
    18             return self.sum(a,b)
    19         elif a<0:
    20             a = self.get_bu(a)
    21         else:
    22             b = self.get_bu(b)
    23 
    24         ans = self.sum(a, b)
    25         if (ans>>32) & 1:
    26             return ans^(1<<32)
    27         else:
    28             return ~(ans^int('1'*32,2))
  • 相关阅读:
    世界排名第二的web前端框架bulma与Bootstrap框架的选择
    Bootstrap5中文手册翻译完毕
    RabbitMQ 学习一 了解+点对点模式
    仿京东搜索
    ES集成SpringBoot
    ElasticSearch
    权限管理整合springsecurity代码执行过程
    权限管理
    Gateway网关
    canal数据同步 客户端代码实现
  • 原文地址:https://www.cnblogs.com/ISGuXing/p/14603393.html
Copyright © 2011-2022 走看看