python之使用位运算符实现加法运算
一哥们去笔试,回来后跟我说了一通面试题,其中有一道题让我很感兴趣:
不使用+号实现加法运算
刚听到后,一脸懵逼,不使用+号怎么算?
问了朋友他也没做这题,不过仔细想了下,不使用+号,是否可以使用其他运算符?比如位运算符
既然说到这,就看下位运算符有哪些,实现是什么:
&---位与运算符,都为真时才真
|---位或运算符,有一个为真时则真
^---位异或运算符,不同时为真时则真
~---位反运算符,取反
<<---位左移运算符,向左移动N位
>>---位右移运算符,向右移动N位
上面这些是针对二进制来运算,针对加法运算,我们需要知道俩件事情:
1、俩个数对应的二进制位相加应该有如下算法
0+0=0
0+1=1
1+1=0
1+0=1
这个对应异或运算符^
但这里又有个问题,这么向前进一位?这就是第二件事
2、什么数相加需要进一位?
算法如下:
0+0=0
0+1=0
1+1=1
1+0=0
也就是在二进制下,当同时为1时需要进一位
这个可以使用位运算符&,然后在向左移动一位即可实现
这样1和2分别计算出了位相加和位移的结果,然后这俩个再通过位相加和位运算,直到不能位移了,最后位相加的数才是最后的俩个数相加的值。
具体代码如下:
def plusNoSignal(x,y):
ex_or = x ^ y
an_mo = (x & y)<<1
while(an_mo):
ex_or_temp = ex_or
an_mo_temp = an_mo
ex_or = ex_or_temp ^ an_mo_temp
an_mo = (ex_or_temp & an_mo_temp)<<1
return ex_or if __name__ = "__main__":
input_numbers = input("please input two numbers separate by ',':")
x = int(input_numbers.split(',')[0])
y = int(input_numbers.split(',')[1])
print(plusNoSignal(x,y))
python之使用位运算符实现加法运算的更多相关文章
- java 位运算符 以及加法 交换两个变量值
先给出十转二的除法 2 60 30 0 15 0 7 1 3 1 1 1 0 1 60转二 111100 再介绍位运算符 a=60 b=13 A = 0011 1100 B ...
- python中的位运算符
按位运算符是把数字看作二进制来进行计算的.Python中的按位运算法则如下,下表中变量 a 为 60,b 为 13,二进制格式如下: a = 0011 1100 b = 0000 1101 ----- ...
- Python 基础1 - 位运算符
引言 本文主要介绍位运算符,实际上Python有以下7类运算符: [赋值运算符].[比较运算符].[算术运算符].[逻辑运算符].[身份运算符].[成员运算符].[位运算符] 位运算符 按位运算符是把 ...
- Java中的位运算符、移位运算
一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&) :两位全为1,结果为1,否则为0: (2)按位或 (|) :两位有一个为1,结果为1,否则为0: (3) ...
- 分享:Python中的位运算符
按位运算符是把数字看作二进制来进行计算的.用的不太多,简单了解. 下表中变量 a 为 60,b 为 13二进制格式如下: a = 0011 1100 b = 0000 1101 a&b = 0 ...
- Java的位运算符——&0xFF的运算与讲解
快放元旦假,没心思做啥的事,就去翻以前的代码遇到这句,但是又不懂,所以只好上网找,终于懂了那么一点点. 所以那个大神看到我说的有问题,请指出!谢谢.... 一:首先区分一下 A~F的意思先 A,代表十 ...
- Python基础学习---位运算符
<< 左移,每移动1位,相当于乘以2 例如:32<<2 等价于:32*4 ==128 >> 右移,每移动1位,相当于除以2 例如: ...
- 23.Python位运算符详解
位运算符通常在图形.图像处理和创建设备驱动等底层开发中使用.使用位运算符可以直接操作数值的原始 bit 位,尤其是在使用自定义的协议进行通信时,使用位运算符对原始数据进行编码和解码也非常有效. 位运算 ...
- 如何使用Python实现图像融合及加法运算?
摘要:本篇文章主要讲解Python调用OpenCV实现图像融合及加法运算,包括三部分知识:图像融合.图像加法运算.图像类型转换. 本文分享自华为云社区<[Python图像处理] 五.图像融合.加 ...
随机推荐
- laravel 填充器Seed
我们在进行多人开发时,发现运行php artisan db:seed --class=填充器名称 发现有报错 Exception trace: 1 ReflectionClass::__constru ...
- RT-thread内核对象--事件集
rt-thread 线程的同步:线程同步是指多个线程通过特定的机制(如互斥量,事件对象,临界区)来控制线程之间的执行顺序 1.事件集:(可以实现一对多,多对多的同步) RT-Thread 定义的事 ...
- Nexus 3 搭建 npm 私服 (windows)
Nexus 3 搭建 npm 私服备忘 下载与安装 在官网下载Nexus Repository Manager OSS 3.x, 解压至任意位置. 管理员运行 powershell, 切换到 nexu ...
- gperftools对程序进行分析
gperftools是google出品的一个性能分析工具,相关介绍可见:https://github.com/gperftools/gperftools/wikigperftools性能分析通过抽样方 ...
- AngularJS入门-demo
双向绑定测试: <body ng-app> 请输入姓名:<input ng-model="myname"> <br> {{myname}},你好 ...
- Itreatot接口实现类中modCount的作用
modCount只有在本数据结构对应迭代器中才使用,以HashMap为例: private abstract class HashIterator implements Iterator { Entr ...
- PM学习梳理--搭建产品架构
- matplotlib 中文显示问题
matplotlib 默认显示不了中文,如果想显示中文,通过下面代码设置: import matplotlib #指定默认字体 matplotlib.rcParams['font.sans-serif ...
- 2019.03.28 bzoj3326: [Scoi2013]数数(数位dp)
传送门 题意: 一个人数数,规则如下: 确定数数的进制B 确定一个数数的区间[L, R] 对于[L, R] 间的每一个数,把该数视为一个字符串,列出该字符串的所有连续子串对应的B进制数的值. 对所有列 ...
- 去掉ACM论文左下角和页眉
在\documentclass下添加如下命令: \fancyhead{} //去掉页眉 \settopmatter{printacmref=false} % Removes citation info ...