简单了解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 相关文章推荐
在Django的视图(View)外使用Session的方法
Jul 23 Python
基于python爬虫数据处理(详解)
Jun 10 Python
Django 中使用流响应处理视频的方法
Jul 20 Python
python+selenium select下拉选择框定位处理方法
Aug 24 Python
使用Python制作一个打字训练小工具
Oct 01 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
python的链表基础知识点
Sep 13 Python
Python内存泄漏和内存溢出的解决方案
Sep 26 Python
python实现图片,视频人脸识别(opencv版)
Nov 18 Python
Python实现日志实时监测的示例详解
Apr 06 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 远程关机操作的代码
2008/12/05 PHP
PHP array_multisort()函数的使用札记
2011/07/03 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
php短址转换实现方法
2015/02/25 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
深入理解JavaScript系列(38):设计模式之职责链模式详解
2015/03/04 Javascript
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
jQuery 更改checkbox的状态,无效的解决方法
2016/07/22 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
jquery实现选项卡切换代码实例
2019/05/14 jQuery
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
Python处理文本换行符实例代码
2018/02/03 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
python实现归并排序算法
2018/11/22 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
PurCotton全棉时代官网:100%天然棉花生产的生活护理用品
2016/11/18 全球购物
新品发布会策划方案
2014/06/08 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
出国留学英文自荐信
2015/03/25 职场文书
天那边观后感
2015/06/09 职场文书
物资采购管理制度
2015/08/06 职场文书
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python