简单了解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爬虫
Dec 25 Python
使用Python实现下载网易云音乐的高清MV
Mar 16 Python
Python Django使用forms来实现评论功能
Aug 17 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
Python 字符串换行的多种方式
Sep 06 Python
对Pycharm创建py文件时自定义头部模板的方法详解
Feb 12 Python
Python 实现Numpy中找出array中最大值所对应的行和列
Nov 26 Python
django使用F方法更新一个对象多个对象字段的实现
Mar 28 Python
Python验证码截取识别代码实例
May 16 Python
python和php哪个更适合写爬虫
Jun 22 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
使用scrapy实现增量式爬取方式
Jun 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
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
js中eval详解
2012/03/30 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
2015/09/11 Javascript
vue component组件使用方法详解
2017/07/14 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
cocos2dx+lua实现橡皮擦功能
2018/12/20 Javascript
javascript实现图片轮播代码
2019/07/09 Javascript
Python 元类使用说明
2009/12/18 Python
python中urlparse模块介绍与使用示例
2017/11/19 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
numpy.random模块用法总结
2019/05/27 Python
python实现网站微信登录的示例代码
2019/09/18 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
怀旧香味蜡烛:Homesick
2019/11/02 全球购物
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
公司领导推荐信
2013/11/12 职场文书
优秀员工个人的自我评价
2013/11/29 职场文书
记帐员岗位责任制
2014/02/08 职场文书
优秀技术工人先进材料
2014/02/17 职场文书
党员党性分析材料
2014/02/17 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
小学教师师德师风自我剖析材料
2014/09/29 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
2014年第四季度入党积极分子思想汇报(十八届四中全会)
2014/11/03 职场文书
婚庆答谢词
2015/01/04 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python