简单了解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分析网页上所有超链接的方法
May 08 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 Python
Python爬虫实例爬取网站搞笑段子
Nov 08 Python
分析python切片原理和方法
Dec 19 Python
django使用xlwt导出excel文件实例代码
Feb 06 Python
python统计多维数组的行数和列数实例
Jun 23 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
python各类经纬度转换的实例代码
Aug 08 Python
keras的backend 设置 tensorflow,theano操作
Jun 30 Python
python使用nibabel和sitk读取保存nii.gz文件实例
Jul 01 Python
Python3获取cookie常用三种方案
Oct 05 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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
图书管理程序(三)
2006/10/09 PHP
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
小谈php正则提取图片地址
2014/03/27 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
Jquery仿IGoogle实现可拖动窗口示例代码
2014/08/22 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
jQuery插件Validate实现自定义表单验证
2016/01/18 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
Bootstrap 模态框(Modal)带参数传值实例
2017/08/20 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
使用Vuex实现一个笔记应用的方法
2018/03/13 Javascript
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
python使用turtle绘制分形树
2018/06/22 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
2019/10/22 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
Perfume’s Club德国官网:在线购买香水
2019/04/08 全球购物
千元咖啡店的创业计划书范文
2013/12/29 职场文书
后勤主管岗位职责
2014/03/01 职场文书
经典商业广告词
2014/03/13 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
优秀家长事迹材料
2014/05/17 职场文书
兽医医药专业求职信
2014/07/27 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
JAVA API 实用类 String详解
2021/10/05 Java/Android