python isodd奇偶_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的学习教程也会定期为大家更新!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java线程中断

【README】 本文po出了不同场景下线程中断的不同开发方式&#xff0c;包括阻塞&#xff0c;非阻塞&#xff0c;io阻塞线程等&#xff1b; 本文部分内容转自&#xff1a;这篇博文写的非常好 Thread的中断机制(interrupt) - 寂静沙滩 - 博客园先看收集了别人的文章&#xff0c…

WEB API系列(一):WEB API的适用场景、第一个实例

在我前一篇博客《WebAPI前置知识:HTTP与RestfulAPI》中已经给各位简单介绍了HTTP协议与RestFul API的关系&#xff0c;以及一些基本的HTTP协议知识&#xff0c;在这些知识的铺垫下&#xff0c;今天&#xff0c;我们一起来讨论一下WEB API的适用场景&#xff0c;然后写我们第一个…

rpa文件怎么提取内容_怎么编辑pdf文件内容?有什么软件可以编辑pdf文件吗?

怎么编辑pdf文件内容&#xff1f;我是2020年大学新生&#xff0c;选择学习的专业是财务管理。为了更快、更深入地了解更多专业知识&#xff0c;我上网查找、下载了很多相关资料。不过&#xff0c;从网上保存下来的资料文件大多是pdf格式的&#xff0c;想要编辑它还得先转word。…

Future取消线程执行

【README】 本文总结于 《java并发编程实战》 page121&#xff0c;非常棒的一本书&#xff1b; 【1】Future 1&#xff0c;介绍&#xff1a;future 用于管理任务的生命周期&#xff0c;处理异常&#xff0c;以及实现取消&#xff1b; 2&#xff0c;future.cancel() 取消方法…

Nancy之结合tinyfox给我们的应用提供简单的数据服务

说到提供数据服务给我们的一些应用&#xff0c;估计用的最多的也就是json和xml这两种数据格式 实现的方法也是多种多样&#xff0c;web api,mvc的jsonresult和contentresult...等等 本文是结合Nancy、TInyFox、Owin等来实现的 一、前提工作 新建一个空的web应用程序 添加相应的…

javaweb调用python算法_请教怎么用java远程调用python? 多谢

请问如何用java远程调用python? 谢谢&#xff01;本帖最后由 blackkettle 于 2015-05-07 13:00:41 编辑比如有一台机器 A上安装了python, 另一台机器B要用java 调用A 上的python的某个函数&#xff0c;输入数据在B机器上&#xff0c;所有的计算在A机器完成&#xff0c;结果返回…

(转)如何查看java本地方法

在线查看本地代码&#xff0c; refer2 http://hg.openjdk.java.net/jdk8/jdk8/hotspot/file/tip/src/os/linux/vm/os_linux.cpp 我们知道在java中查看java源码时看到native方法在java层面上就到头的&#xff0c;如果还想继续往下看就需要看jdk是如何实现的&#xff0c;今天就分…

统一配置中心的设计方案

转载自 统一配置中心的设计方案对于配置文件&#xff0c;我们不陌生&#xff0c;它提供我们可以动态修改程序运行能力。引用别人的一句话就是&#xff1a;系统运行时(runtime)飞行姿态的动态调整。我可以把我们的工作称之为在快速飞行的飞机上修理零件。我们人类总是无法掌控和…

微软CEO纳德拉恢弘计划:让开发者始终忘不了微软

BI中文站 4月11日 报道 当微软前CEO史蒂夫•鲍尔默&#xff08;Steve Ballmer&#xff09;在2000年喊出“开发者&#xff0c;开发者&#xff0c;开发者”的口号时&#xff0c;他可能有点儿激动&#xff0c;但是他的观点是对的。 30年前当Windows 1.0推出的时候&#xff0c;这种…

python scratch unity_Unity3D研究院之2D游戏开发制作原理(二十一)

经过了4个月不懈的努力&#xff0c;我和图灵教育合作的这本3D游戏开发书预计下个月就要出版了。这里MOMO先打一下广告&#xff0c;图灵的出版社编辑成员都非常给力&#xff0c;尤其是编辑小花为这本书付出了很大的努力&#xff0c;还有杨海玲老师&#xff0c;不然我也无法完成这…

原码补码与反码

【README】 1.本文内容总结自“哈工大刘宏伟”老师的mooc视频《计算机组成原理》on bilibili&#xff1b; 2.为了便于理解&#xff0c;本文引入了逗号分割符号部分和数值部分&#xff0c;计算机存储数据的时候没有逗号&#xff1b; 【1】原码表示法 原码定义&#xff1a; 原…

第一篇 Entity Framework Plus 之 Audit

一般系统会有登陆日志&#xff0c;操作日志&#xff0c;异常日志&#xff0c;已经满足大部分的需求了。但是有时候&#xff0c;还是需要Audit 审计日志&#xff0c;审计日志&#xff0c;主要针对数据增&#xff0c;改&#xff0c;删操作数据变化的记录&#xff0c;主要是对数据…

本想试试看,结果却拿到了京东的Offer

转载自 本想试试看&#xff0c;结果却拿到了京东的Offer 最近&#xff0c;春招已经基本接近尾声了&#xff0c;我找了几位拿到名企Offer的粉丝&#xff0c;请他们总结了面试经验&#xff0c;近期会分批的推送给大家。希望给那些正在准备秋招的同学提供些帮助。 今天给大家分享的…

ping 命令使用代理_网络检测知识篇:ping命令使用知识,你知道几点?

Ping命令其实是一个非常好的网络故障诊断工具&#xff0c;相信阅读完本文对大家一定有些帮助。如果大家网络遇到问题&#xff0c;不妨试试以下方法。首先使用Ping命令诊断本地TCP/IP协议是否安装正常&#xff0c;检测方法如下&#xff1a;从电脑开始里找到运行&#xff0c;快捷…

8.4-中断系统小结(cpu中断七个问题)

【README】 本文转自bilibili《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】中断介绍 1&#xff09;作用&#xff1a;用中断系统实现了外设数据的输入输出&#xff1b; 还可以用于程序调试&…

第二篇 Entity Framework Plus 之 Query Future

从性能的角度出发&#xff0c;能够减少 增&#xff0c;删&#xff0c;改&#xff0c;查&#xff0c;跟数据库打交道次数&#xff0c;肯定是对性能会有所提升的&#xff08;这里单纯是数据库部分&#xff09;。 今天主要怎样减少Entity Framework查询跟数据库打交道的次数&#…

python长整数相乘_python写的大整数相乘的方法

输入72106547548473106236 982161082972751393 两个大整数输出结果70820244829634538040848656466105986748解题思路首先根据 大整数相乘的原理的基础上&#xff0c;把大整数进行优化拆分&#xff0c;拆分的长度&#xff0c;要考虑语言中整形的长度。这里用的python&#xff0c…

Java Web应用的代码分层最佳实践

转载自 Java Web应用的代码分层最佳实践代码分层&#xff0c;对于任何一个Java Web开发来说应该都不陌生。一个好的层次划分不仅可以能使代码结构更加清楚&#xff0c;还可以使项目分工更加明确&#xff0c;可读性大大提升&#xff0c;更加有利于后期的维护和升级。从另外一个角…

中断屏蔽技术

【README】 本文总结自bilibili《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】中断屏蔽 1&#xff0c;中断屏蔽的意思是&#xff0c;在中断1的服务程序执行过程中&#xff0c;不允许被其他中断…

.NET FM的未来计划

2016年3月21日&#xff0c;我们启动了.NET FM这档独立播客来服务中文.NET和微软技术社区。如同早先感谢信所言&#xff0c;能够得到社区的肯定和全力支持&#xff0c;二位主播是受宠若惊。关于未来的计划&#xff0c;下面简单和大家分享一下。 首先&#xff0c;关于节目播出频率…