剑指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 第三种 ...
随机推荐
- Kotlin 数据类与密封类
数据类 Kotlin 可以创建一个只包含数据的类,关键字为 data: data class User(val name: String, val age: Int) 编译器会自动的从主构造函数中根据 ...
- canvas 水波纹
<!DOCTYPE html> <html> <head> <title>水波背景</title> <meta charset=&qu ...
- [GXOI/GZOI2019]旧词
很像LNOI 2014 LCA那道题. 同样的套路,离线以后直接扫描线. k=1的话就是原题. 考虑一般情况. 原本的做法是对x到根的这条链做一下区间+1操作,目的是为了是的在深度为i的位置得到的贡献 ...
- 剑指Offer-和为S的连续正数序列
题目: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就 ...
- 搭建Java开发环境及相关工具
本文主要记录下在window环境下,搭建Java开发环境,及需要安装的工具软件说明,旨在方便快速完成这些正真开始开发前的准备工作. 1.JDK安装及环境配置 此处安装JDK1.8的版本,官方下载地址: ...
- django模型系统(一)
django模型系统(一) djangode ORM ORM:对像关系映射 用python概念去表达数据库 数据库配置(mysql) 安装pumysql 修改项目目录下的__init__.py imp ...
- Redis基础知识小结
Redis是一个高性能的key-value型数据库.Redis能读的速度是110000次/s,写的速度是81000次/s ,性能极高.Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全 ...
- windows下Xshell远程访问虚拟机
下载Xshell 5软件在windows下安装 安装好后Xshell 5启动软件 下一步,检查虚拟机,配置是否正确 下一步,设置网络,保障虚拟机系统能够连接网络 下一步,进入虚拟机系统,检查虚拟机网络 ...
- Could not autowire. No beans of 'xxxx' type found的错误
在Idea的spring工程里,经常会遇到Could not autowire. No beans of 'xxxx' type found的错误提示.但程序的编译和运行都是没有问题的,这个错误提示并 ...
- JSP中客户端跳转与服务器端跳转的区别
转载自:https://www.cnblogs.com/memewry/archive/2012/08/21/2649988.html 客户端跳转时用HttPservletResopse对象的send ...