简单了解python的一些位运算技巧


Posted in Python onJuly 13, 2019

前言

位运算的性能大家想必是清楚的,效率绝对高。相信爱好源码的同学,在学习阅读源码的过程中会发现不少源码使用了位运算。但是为啥在实际编程过程中应用少呢?想必最大的原因,是较为难懂。不过,在面试的过程中,在手写代码过程中,写出一两个位运算的代码,还会让面试官眼前一亮的。

位运算常用的运算符包括&(按位与), | (按位或),~(按位非),^(按位异或),<< (有符号左移位) ,>>(有符号右移位)。

简单了解python的一些位运算技巧

下面用几个例子说明其应用,希望对你有所启发。

1、判断奇数还是偶数

通常判断奇数还是偶数我们想到的办法就是除以2,看余数是否为0。

Python代码如下:

def isodd(x):
 return True if (x % 2 <> 0) else False

如何使用位运算呢?

我们只需要使用&运算,与1进行&,如果为1,那么该数为奇数;如果为0,那么该数是偶数,Python代码如下:

def isodd(x):
 return True if (x & 1) else False

2、左移一位相当于乘以2,右移一位相当于除以2

在面试的过程中,通常会遇到的一个问题是写二分查找代码。

二分查找的代码如下:

def binary_search(list, item):
 '''
 :param list: 有序列表
 :param item: 要查找的元素
 :return: item在list中的索引,若不在list中返回None
 '''
 low = 0
 high = len(list) - 1
 while low <= high:
 midpoint = (low + high) // 2
 if list[midpoint] == item:
 return midpoint
 elif list[midpoint] < item:
 low = midpoint + 1
 elif list[midpoint] > item:
 high = midpoint - 1
 return None

其中有一步是需要取最小小标和最大下标的中间值,若使用位运算符,midpoint = (low + high) >> 1,面试官肯定会对你刮目相看。

3、交换两个数值

数值交换的代码相信大家都非常熟悉了,因为似乎是从学编程语言的最开始就一直用:

temp = b
b = a
a = temp

但是怎么使用位运算来完成此功能呢?

a ^= b
b ^= a
a ^= b

确实比较难理解,原理是什么呢?

第一行,a = a ^ b,很容易理解;

第二行, b = b ^ a = b ^ a ^ b,由于 b ^ b = 0,所以 b = a ^ 0,即 b = a;

第三行, a = a ^ b ,由于a在第一步重新赋值,所以,a = a ^ b ^ a = b,完成了数值交换。

这里,总结下异或运算的特性:任意数和自身异或结果为0;0和任意数异或结果还是其本身。

4、寻找数据列表中的独一无二

有一个数据列表(2N+1个整数),只有一个数出现了1次,其余N个数都出现了2次。如何找到这个独一无二的数据?

看到这个题目,相信大家第一次想到的算法肯定是计数,建立列表,循环整个数据并计数,然后遍历这个列表找到出现次数为1的数据。

这样,空间复杂度为O(N)。

如何降低空间复杂度呢?

注意看一下刚刚讲过的异或的特性:任意数和自身异或结果为0;0和任意数异或结果还是其本身。

那么,出现了2次的N个数异或的结果是0,再与出现次数为1次的数异或的结果即为该数。即:找到这个独一无二数据的办法是通过对全部的数据进行异或操作,空间复杂度降低为O(1)。

5、计算一个数值的二进制数中有多少个1

相信有了之前的基础,大家很容易实现这个算法。单纯的通过位运算,与1进行与运算,看是否结果为1,然后右移1位,继续判断。Python代码实现如下:

def number1Bit(x):
 count = 0
 while x:
 count = count + (x&1)
 x = x >> 1
 return count

这样存在一个问题,就是如果有连续多个0,那么需要做多次移位操作。有没有简单的方式跳过连续多个0的情况?

那就是通过与(x-1)进行&运算。这里可能不太好理解,举例说明一下

x 1110 0000
x - 1 1101 1111
x&(x-1) 1100 0000

通过这种方式,会把最后的那个1检测出来。

Python代码实现如下:

def number1Bit(x):
 count = 0
 while x:
 count = count + 1
 x = x & (x-1)
 return count

总结:

1、与运算通常应用的场景是获取某一位的值为1还是0(如判断奇数偶数,统计数值中1的个数);

2、左移右移特性:左移一位相当于乘以2,右移一位相当于除以2;

3、异或特性:任意数和自身异或结果为0;0和任意数异或结果还是其本身。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 装饰器深入理解
Mar 16 Python
python中如何使用正则表达式的非贪婪模式示例
Oct 09 Python
对python实现二维函数高次拟合的示例详解
Dec 29 Python
对python 中class与变量的使用方法详解
Jun 26 Python
django云端留言板实例详解
Jul 22 Python
opencv调整图像亮度对比度的示例代码
Sep 27 Python
深入了解如何基于Python读写Kafka
Dec 31 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
python rsa-oaep加密的示例代码
Sep 23 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
python实现马丁策略回测3000只股票的实例代码
Jan 22 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 21 Python
简单了解python PEP的一些知识
Jul 13 #Python
python爬虫神器Pyppeteer入门及使用
Jul 13 #Python
Python 分享10个PyCharm技巧
Jul 13 #Python
简单了解Python3里的一些新特性
Jul 13 #Python
python将类似json的数据存储到MySQL中的实例
Jul 12 #Python
Django对数据库进行添加与更新的例子
Jul 12 #Python
Python 绘制酷炫的三维图步骤详解
Jul 12 #Python
You might like
php实现mysql数据库备份类
2008/03/20 PHP
PHP 手机归属地查询 api
2010/02/08 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
Vue动态组件实例解析
2017/08/20 Javascript
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
神经网络理论基础及Python实现详解
2017/12/15 Python
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
Python Lambda函数使用总结详解
2019/12/11 Python
python实现二分类和多分类的ROC曲线教程
2020/06/15 Python
5款实用的python 工具推荐
2020/10/13 Python
call在Python中改进数列的实例讲解
2020/12/09 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
索尼巴西商店:Sony巴西
2019/06/21 全球购物
仓库管理员岗位职责
2014/03/19 职场文书
2015年银行客户经理工作总结
2015/04/01 职场文书
信用卡催款律师函
2015/05/27 职场文书
学历证明样本
2015/06/16 职场文书
工商局调档介绍信
2015/10/22 职场文书
小学新课改心得体会
2016/01/22 职场文书
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android