技术标签: python位运算符
一、位运算概念
位运算是直接对整数在二进制中进行操作。另我们的电脑电路设计都是基于二进制的,所以在二进制层面效率很高。通常位运算多用在对程序效率要求很高的场景。以下的二进制都以8位为例。第1位是符号位,后面7位是数字位。符号位用0代表非负数,用1代表负数。
二、2进制编码
1、原码
原码是二进制的一种表现方式。取该整数的绝对值的二进制,再加上符号位。该原码只是为了让我们看二进制更直观,直接看出正负数和比较大小。但原码不是计算机保存的二进制,所以不能直接参与计算。如下:
2、反码
反码主要是针对负数的处理。在原码的基础上,符号位不变,其他数值位取反,即把1变成0,把0变成1。反码是为了在计算机中存储二进制,但非真正的二进制值,所以也不直接参与计算。
3、补码
补码是真正的二进制值了,主要也是针对负数。非负数不变,而负数是在反码的基础上加1。如下:
总结如下:
1、正数的二进制值,原码、补码、反码都是一样的;
2、负数的二进制值是其补码,即反码加1。
三、位运算运算符含义功能&按位与如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。
|按位或两个相应的二进制位中只要有一个为1,该位的结果值为1。
∧按位异或若参加运算的两个二进制位同号则结果为0(假)异号则结果为1(真)
~取反~是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0。
<<左移左移运算符是用来将一个数的各二进制位全部左移N位,右补0。
>>右移表示将a的各二进制位右移N位,移到右端的低位被舍弃,对无符号数,高位补0。
1、按位与(&)
按位与,即按照对应位置的二进制and比较。可以把1当作true,把0当作false。1 and 1 = 1,1 and 0 = 0,0 and 1 = 0,0 and 0 = 0,如下示意图:
5&1结果为1。那这个有什么用呢?举个例子:判断数字是奇数还是偶数。普通判断方法求数字除以2求余。传统做法如下:
n%2 == 0 #True为偶数,False为奇数
可以用按位与运算判断奇偶,运算效率要高很多:
n&1 == 1 #按位于运算奇数返回1,偶数返回0
2、按位或(|)
按位或,即安装对应位置的二进制or比较。1 or 1 = 1,1 or 0 = 1,0 or 1 = 1,0 or 0 = 0。如:
5|3结果为7。我们可以利用这个方法对数值修正,例如取每个整数向上取奇数。若在这个基础上减1,可以得到向下取偶数。
>>> map(lambda x:(x|1)-1, range(6))
[0, 0, 2, 2, 4, 4]
>>> map(lambda x:x|1, range(6))
[1, 1, 3, 3, 5, 5]
3、按位异或(^)
按位异或,则是按照对应位置的二进制xor比较。1 xor 1 = 0,1 xor 0 = 1,0 xor 1 = 1,0 xor 0 = 0。例如:
5^3结果为6。出一道算法题目:已知一个数字数组。其中只有一个数字只出现1次,其他数字都出现2次。求只出现1次的数字。利用reduce函数,一句话代码搞定且效率很高。
def get_one(nums):
return reduce(lambda x,y: x^y, nums)
nums=[1,1,3,2,4,3,4]
get_one(nums)
4、按位翻转(~)
按位翻转,即不管符号位还是数值位,全部取反码。即1变成0,0变成1。翻转和按位异或有关系,翻转相当于和-1按位异或:~n = n^-1。
这个也可以用于加解密运算。
5、左移运算(<<)
左移运算是将二进制数值整体向左边移动n个位置,空出来的位置补0。例如5<<2:
左移两位,数字5变成20,多了4倍。而从二进制看多了100倍。十进制的4等于二进制的100。这么看来左移运算可以用于乘法计算。
6、右移运算(>>)
右移运算是将二进制数值整体向右边移动n个位置,空出来的位置补上符号位的数值。即正数补0,负数补1。这个右移运算可以类似上面左移运算用于乘法一样,用于除法。这个你可以自己尝试一下。右移了两位相当于101B除以100B,二进制100B对应十进制是3。可以发现该除法计算是取结果的整数部分,5/3 = 1:
前两天发现https://blog.csdn.net/qq_34139994/article/details/105878101这个例子、仔细研究了一下发现离实际使用还差很远。然后按照那个思路重写了一个。还有一些BUG、和未完成功能。希望大家一起完善https://gitee.com/adss22e/qt-draw-region...
最近意外的发现了几个windows10系统的有趣的快捷键,和大家分享一下吧!1.关于截屏a.win键+printscreen键,自动对当前画面截屏(可以观察到屏幕会闪动一下),并且保存到图片文件夹,也会保存的剪贴板。b.win键+shift+s,进入截屏模式,可以自由的选择截屏的区域。2.启动设置 win键+I 资源管理器 win键+E3.启动颜色滤镜win键+ctrl+c,可以进入灰度模式,...
前言RocketMQ是目前主流的消息中间件之一,并且自身就支持分布式功能。最初由阿里巴巴团队开发,并且经历过双十一等海量消息场景的考验,后捐赠给Apache开源基金会,这也是为什么我们经...
哈佛大学最受学生欢迎的计算机课程 CS50 有配套实验了!带你入门编程的美妙世界!美国计算机四大名校是:斯坦福(Stanford)、加州伯克利(UC-Berkeley)、麻省理工(MIT...
如何将自己的python库打包成wheel文件,并上传到pypi?以下操作都使用python3新建setup.py在项目根目录新建setup.py,内容如下from setuptools import find_packagesfrom setuptools import setupsetup( name="my-db-driver", author="jimo", version="2.0.0", author_email="[email protected]",
基于前馈神经网络的时间序列异常检测算法引言在时间序列异常检测中,特征工程往往是非常繁琐而复杂的,怎样才能够减少时间序列的特征工程工作量一直是一个关键问题。在本文中,作者们提出了一个新的思路,使用深度学习的办法来进行端到端的训练,从而减少时间序列的特征工程。提到深度学习,大家都能够想到卷积神经网络(Convolutional Neural Network )在图像识别中的优异表现,能够想到循环神经网...
有些时候我们在编写代码或者阅读开源项目时经常会遇到一些陌生的宏定义,在找遍所有源代码都没发现其在哪里被定义过,这时这些宏定义很可能是系统编译器自己定义的,例如#ifdef RW_SPINLOCK_USE_X86_INTRINSIC_// A more balanced Read-Write spin lock implemented based on GCC intrinsics.nam
Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结:先看下面的代码:<shape> <!-- 实心 --> <solid android:color="#ff9d77"/> <!-- 渐变 --> ...
The Blocks ProblemTime Limit: 1000 MS Memory Limit: 10000 KB64-bit integer IO format: %I64d , %I64u Java class name: Main[Submit] [Status] [Discuss]DescriptionMany areas of Compute...
微信小程序 合法域名校验出错微信的request的请求必须有合法域名,否则请求不成功 设置步骤如下: 1. 以管理员身份登录微信小程序后台 地址:http://mp.weixin.qq.com 2. 将要请求的域名设置为请求合法域名 注:request 合法域名可以填写多个,如果已经有其它的合域名了,新增一个就行了如图所示: 注:request安全域名保存并提交后,微信会有
编辑:彭文华来 源:大数据架构师(ID:bigdata_arch)今天的问题也是来自于一位彭友在群里的提问。她说:企业主数据和One ID是什么关系?也有人说:这俩不都是对某些重要的数...
今天给大家介绍一个电子发票管理系统,适合电子发票的管理,用户等级关系明确,功能丰富。功能介绍这个电子发票管理系统分为三级关系,系统管理员,租户管理员,用户。 三者关系,系统管理员管理全部,租户管理员比如为市教育局,租户为学校,用户为老师。租户的授权期限到了,租户下的所有用户都不能登录。 每个租户管理员只能管理本租户内的租户和用户,用户只能管理本租户内的电子发票。该系统只针对电子发票管理,不开电子发票。开发环境开发工具:IDEA、Jdk1.8、SpringBoot2.0.6版本项目