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))
LeetCode:不用加号的加法(位运算)的更多相关文章
- LeetCode(不用加号的加法)
题目: 设计一个函数把两个数相加,不得使用+或者其他算数运算符. 示例: 输入:a=1,b=1 输出:2 提示: a,b均有可能是负数或0 结果不会溢出32位整数 初始思路: 看到题目我就明白只能用位 ...
- 剑指 Offer 65. 不用加减乘除做加法 + 位运算
剑指 Offer 65. 不用加减乘除做加法 Offer_65 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGa ...
- 剑指offer-面试题65-不用加减乘除做加法-位运算
/* 题目: 在不使用加减乘除的前提下,计算两个整数之和. 思路: 不能使用加减乘除则只能考虑位运算. x=num1^num2,则为抹掉进位的结果. y=num1&num2,为只有进位的结果. ...
- LeetCode 78. 子集 C++(位运算和回溯法)
位运算 class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { ...
- 【Leetcode】 - Divide Two Integers 位运算实现整数除法
实现两个整数的除法,不许用乘法.除法和求模.题目被贴上了BinarySearch,但我没理解为什么会和BinarySearch有关系.我想的方法也和BS一点关系都没有. 很早以前我就猜想,整数的乘法是 ...
- python不用加号实现加法
问题: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.E ...
- Java实现 LeetCode 832 翻转图像(位运算)
832. 翻转图像 给定一个二进制矩阵 A,我们想先水平翻转图像,然后反转图像并返回结果. 水平翻转图片就是将图片的每一行都进行翻转,即逆序.例如,水平翻转 [1, 1, 0] 的结果是 [0, 1, ...
- C语言不使用加号实现加法运算的几种方法
今天看到<编码:隐匿在计算机软硬件背后的语言>的第十二章:二进制加法器.讲述了全加器,半加器的原理以及如何实现加法.实现加法时所使用的全加器,半加器中包含的所有逻辑门在C语言中都有相应的运 ...
- LeetCode刷题总结-双指针、位运算和分治法篇
本文总结LeetCode上有关双指针.位运算和分治法的算法题,推荐刷题总数14道.具体考点分析如下图: 一.双指针 1.字符串和数组问题 题号:424. 替换后的最长重复字符,难度中等 题号:828. ...
- LeetCode:位运算实现加法
LeetCode:位运算实现加法 写在前面 位运算符 实现加法的思路 两个加数,比如5(101)和6(110),如何不用加法就能得出两者之和呢? 我们知道二进制计算中,如果使用异或将会产生无进位的两者 ...
随机推荐
- 使用JAVA调用KRPANO加密XML
KRPano自带的命令行工具krpanotools可以加密XML,具体的参数说明如下语法: krpanotools32.exe encrypt [OPTIONS] inputfiles input ...
- numpy中矩阵的逆,求解,特征值,特征向量
逆:numpy.linalg.inv() # 求矩阵的逆import numpy as npa=np.mat('1 0;0 1')#生成一个矩阵print(type(a))b=np.linalg.in ...
- package.json指南
一.属性 name 定义项目的名称,不能以"."和"_"开头,不能包含大写字母 version 定义项目的版本号,格式为:大版本号.次版本号.修订号 descr ...
- 使用 Sealos 构建低成本、高效能的私有云
这个时候谈论私有云似乎有点反直觉?大部分人认知不是上云是大趋势嘛?我也比较认可上云,不过私有云也是云,今天给大家带来一个新的选择 -- 用云,只需一个 Sealos 就够了. 看看我们怎么做到更低的成 ...
- 【保姆级安装使用教程#1】Xshell与Xftp的下载、安装和使用
1. 下载 官网下载地址:==Xshell与Xftp下载地址== 当然也可以用鄙人的百度网盘连接下载这是链接:链接百度网盘下载Xshell与Xftp分别下载Xshell与Xftp 2. 安装Xshel ...
- MySQL快速导入千万条数据(3)
目录 一.测试环境 二.命令行导入方式 三.LOAD DATA导入方式 四.结论 接上文,本次在较高性能的X86物理机上,做真实生产环境的大数据量导入测试. 一.测试环境 ■ CPU是24核,每核2线 ...
- jmeter的全局变量(将登陆token设置全局)
1.首先调用登陆接口,用json提取器,取出响应内的token值 2.在beanshell取样器中设置全局变量 //设置全局变量方法一:用函数__setProperty设置${__setProper ...
- 使用LiME收集主机物理内存的内容时发生宕机
作者 pengdonglin137@163.com 现象 在一台ARM64的Centos7虚拟机里加载 https://github.com/504ensicsLabs/LiME 编译出的内核模块时发 ...
- React框架的基本运行原理与组件定义方式
React框架的基本运行原理 React的本质是内部维护了一套虚拟DOM树,这个虚拟DOM树就是一棵js对象树,它和真实DOM树是一致的,一一对应的. 当某一个组件的state发生修改时,就会生成一个 ...
- CSS之transition属性
1.鼠标移动到div中背景颜色慢慢变化(1个属性的变化) <!DOCTYPE html> <html> <head> <title></title ...
