剑指offer用位运算实现两个数相加,及python相关的位操作
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
代码:
# -*- coding:utf-8 -*-
class Solution:
def Add(self, num1, num2):
# write code here
tsum=(num1^num2)&0xFFFFFFFF#step1:相加但不计进位的结果,因python无位数限制,在此将其限定在32位
carry=((num1&num2)<<1)&0xFFFFFFFF#step2:求出进位结果,并将其转成32位
while(carry):#step3:当有进位时,需要将step1和step2的结果继续相加,即重复step1和stwp2.
num1=tsum
num2=carry
tsum=(num1^num2)&0xFFFFFFFF#相加但不计进位的结果,并将其转成32位
carry=((num1&num2)<<1)&0xFFFFFFFF#求出进位结果,并将其转成32位
#直到carry为0,即:直到没有进位为止。
#最后返回最终的异或(相加)结果
#注意:8位可以表示的数值范围在 -128到+127,即(100000000-01111111),第一位是符号位。
#所以32位可以表示的数值范围在 1000 0000 0000 0000 0000 0000 0000 0000到0x7FFFFFFF,即-2147483648到2147483647,但
#是python没有位数限制,即不存在最高位溢出,不会将表示负数的最高位‘1’认为是符号位,所以会将1000 0000 0000 0000 0000 0000 0000 0000认为是2147483648。
#因此需要进行越界检查,将负数进行相应处理: ~(tsum^0xFFFFFFFF)
return tsum if tsum<=0x7FFFFFFF else~(tsum^0xFFFFFFFF)#python的位运算没有无符号右移操作,需要越界检查
python相关的位操作 (以下部分转自原文:https://blog.csdn.net/u013061183/article/details/78525807)
由于数值在计算机中的存储采用的是补码存储,所以一般的位运算都是基于补码进行的。现假设某计算机字长为8位 。
原码: 正数转化为2进制,负数第一位取1。
1 : 0000 0001
-1 : 1000 0001
反码:
正数的原码不变,负数为原码符号位不变,其余取反。
1 : 0000 0001
-1 : 1111 1110
补码:
正数原码不变,负数为原码符号位不变,其余的按位取反再加一,故1000 0000可以表示为-128
1: 0000 0001
-1 :1111 1111
在这个链接里面有原理的详尽的解释:
https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
Python中的按位运算符有:左移运算符(<<),右移运算符(>>),按位与(&),按位或(|),按位翻转(~)。这些运算符中只有按位翻转运算符是单目运算符,其他的都是双目运算符。
python中的&:
A&B
利用A,B的补码按位与(1&1=1,1&0=0,0&0=0),然后把得到的补码还原,1&1=1
python中的|:
A|B
利用A,B的补码按位并(1|1=1,1|0=1,0|0=0),然后把得到的补码还原。1|0=1
python中的^:
A^B
利用A,B的补码按位异或(1^1=0,1^0=1,0^0=0,即相同为0,不同为1),然后把得到的补码还原。1^1=0
python中的~:
~A
A的补码按位取反(~1=0,~0=1),得到的为补码,输出还原结果。~1=-2(因为1的补码为0000 0001,按位取反为1111 1110 这个是-2的补码)
python中的>>:
A>>n
A的补码按位向右移动n位,左边缺少的地方补符号位(即正数补0,负数补1)(相当于除以2的n次方取整 -8>>1=-8//2=-4 -8>>2=-8//4=-2)
python中的<<:
B<< n
B的补码按位向做移动n位,右边缺少的补0(相当于乘以2 ,4<<1=4*2=8,4<<2=4*4=16)
注意:python的<<,与c和java中的不一样,因为他们有字符长度,8位,16位,32位,所以32位为例,如果1<<31=-2147483648,1<<32=0,因为高位溢出,但是在python中1<<31=2147483648,1<<32=4294967296,因为在python中整数是不限长度的(即不存在高位溢出)
剑指offer用位运算实现两个数相加,及python相关的位操作的更多相关文章
- 剑指offer 11. 位运算 二进制中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. //思想:用1(1自身左移运算,其实后来就不是1了)和n的每位进行位与,来判断1的个数 private stat ...
- (原)剑指offer之位运算
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: count为1的位数,初始为零 每次右移一为,与1做与运算,结果不为零说明最后一位为1 c++代码如下 in ...
- 剑指Offer - 九度1509 - 树中两个结点的最低公共祖先
剑指Offer - 九度1509 - 树中两个结点的最低公共祖先2014-02-07 01:04 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先. 输入: 输入可能包含多个测试样 ...
- 剑指Offer - 九度1519 - 合并两个排序的链表
剑指Offer - 九度1519 - 合并两个排序的链表2013-11-30 22:04 题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则.(hi ...
- 剑指Offer - 九度1512 - 用两个栈实现队列
剑指Offer - 九度1512 - 用两个栈实现队列2013-11-29 21:23 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 输入: 每个输入 ...
- 【剑指Offer】翻转单词顺序列 解题报告(Python)
[剑指Offer]翻转单词顺序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...
- 【剑指Offer】复杂链表的复制 解题报告(Python)
[剑指Offer]复杂链表的复制 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...
- 【剑指Offer】数据流中的中位数 解题报告(Python)
[剑指Offer]数据流中的中位数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- leetcode 338. Counting Bits,剑指offer二进制中1的个数
leetcode是求当前所有数的二进制中1的个数,剑指offer上是求某一个数二进制中1的个数 https://www.cnblogs.com/grandyang/p/5294255.html 第三种 ...
随机推荐
- python中的mysql数据库like模糊查询
%在python中是个特殊的符号,如%s,%d分别代表了字符串占位符和数字占位符. 大家知道,mysql的模糊查询也需要用到%. 所以,可以先把需要查的字符串抽出来,再以参数方式传入. args = ...
- Ubuntu16.04安装Anaconda2
1.下载Anaconda2: 官网上下载相应的版本,我下载的是Anaconda2-2018.12-Linux-x86_64.sh 2.安装Anaconda2: 在文件的目录输入命令:bash Anac ...
- python日志模块的使用
学习一下python的日志模块logging,可以参考如下博客,写得很详细 https://www.cnblogs.com/yyds/p/6901864.html https://www.cnblog ...
- android ----- 分享的连接在手机上打开App
首先做成HTML的页面,页面内容格式如下: <a href="[scheme]://[host]/[path]?[query]">启动应用程序</a> 这一 ...
- 理解不为人知的ClassLoader
JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中. 2.显式装载, 通过class.forname()等方法,显 ...
- (桥接)完美解决linux设置静态ip。
网上找来找去都是一些隔靴挠痒的操作,这里引自https://blog.csdn.net/yefeng0810/article/details/81150605.感谢大佬的博客.
- Docker 容器技术
前言: 之前感觉Docker是一种小虚拟机,docker和KVM虚拟机之间有什么区别.联系.可以应用在什么样的生产环境? 一.Docker是什么以及和KVM的区别 1.docker概念? Docker ...
- (1)vue点击图片预览(可旋转、翻转、缩放、上下切换、键盘操作)
今天做项目的时候,遇到了新需求,需要把点击图片放大的功能.学习了一下GitHub上的viewerjs插件 GitHub地址:https://github.com/fengyuanchen/viewer ...
- CSS3-3
关于背景 一. 渐变&径向渐变(background-image: -webkit-linear-gradient() && background-image: -webkit ...
- 生成不同尺寸dimen的xml文件以及文件夹
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...