详解Python中位运算的简单实现
作者:玩转测试开发 发布时间:2021-09-07 14:36:38
标签:Python,位运算
简介
程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作,一般是将数字化为二进制数后进行操作。
应用场景
在常规操作和位运算的操作中使用位运算,可以提升性能。但是会造成代码难以理解,建议合理利用。
1、统计奇数
2、统计偶数
3、统计不相同数等
4、求相反数
位运算分有6种:
1、按位与:两个位都为1时,结果才为1(统计奇数)即全1为1。
2、按位或:两个位都为0时,结果才为0(统计偶数)即全0为0。
3、按位异或:两个位相同为0,相异为1(常用统计不相同数)即不同为1。
4、按位取反:0变1,1变0,相当于 -x-1
5、左移运算:各二进位全部左移若干位,高位丢弃,低位补0。
6、右移运算:各二进位全部右移若干位,对无符号数,高位补0,有符号数进行补符号位(算术右移),或者补0(逻辑右移)。
案例源码
# -*- coding: utf-8 -*-
# time: 2022/5/22 17:56
# file: bitwise.py
# 公众号: 玩转测试开发
# &:两个位都为1时,结果才为1(统计奇数)即全1为1。
a1 = 10
b1 = 9
"""
10 = 0b1010
9 = 0b1001
8 = 0b1000
"""
print(bin(a1))
print(bin(b1))
print(a1 & b1) # 8
print(int("0b1000", 2))
# |:两个位都为0时,结果才为0(统计偶数)即全0为0。
a2 = 10
b2 = 9
"""
10 = 0b1010
9 = 0b1001
11 = 0b1011
"""
print(bin(a2))
print(bin(b2))
print(a2 | b2) # 11
print(int("0b1011", 2))
# ^:两个位相同为0,相异为1(常用统计不相同数)即不同为1。
a3 = 10
b3 = 9
"""
10 = 0b1010
9 = 0b1001
3 = 0b0011
"""
print(bin(a3))
print(bin(b3))
print(a3 ^ b3) # 11
print(int("0b0011", 2))
# ~:0变1,1变0,相当于 -x-1
a4 = 10
"""
10 = 0b1010
-x-1 = -11
"""
print(bin(a4))
print(~a4) # -11
print(int("-0b1011", 2))
# 求相反数
print(~a4 + 1) # -10
# <<:各二进位全部左移若干位,高位丢弃,低位补0,即:x << n = x * (2 ** n)
a5 = 10
"""
10 = 0b1010
x = 10 * 2 ** 3 = 10 * 2 * 2 * 2
"""
b5 = a5 << 3
print(bin(b5))
print(b5) # 80
print(int("0b1010000", 2))
# >>:各二进位全部右移若干位,对无符号数,高位补0,有符号数进行补符号位(算术右移),或者补0(逻辑右移)。
# 即:x << n = x / (2 ** n)
a6 = 64
"""
64 = 0b1000000
x = 64 / (2 ** 3) = 64 / (2 * 2 * 2)
"""
b6 = a6 >> 3
print(bin(b6))
print(b6) # 8
# 经典案例:使用 ^ 找出出现一次的数
a7 = 1 ^ 1 ^ 2
a8 = 1 ^ 2 ^ 1
a9 = 2 ^ 1 ^ 1
print(a7)
print(a8)
print(a9)
# 统计原始方法和位运算方法花费的时间
import time
loop = 30000000
start1 = time.time()
odd_list1 = []
for i in range(loop):
if i & 1 == 1:
odd_list1.append(i)
end1 = time.time()
print(f"time1:{end1 - start1}")
start2 = time.time()
odd_list2 = []
for i in range(loop):
if i % 2 == 1:
odd_list1.append(i)
end2 = time.time()
print(f"time2:{end2 - start2}")
# time1:5.262001037597656
# time2:4.736037492752075
来源:https://blog.csdn.net/hzblucky1314/article/details/125493985
0
投稿
猜你喜欢
- 本文实例讲述了python根据路径导入模块的方法,分享给大家供大家参考。具体方法如下:常规做法如下:import sys sys.path.
- 一、线性回归的理论1)线性回归的基本概念线性回归是一种有监督的学习算法,它介绍的自变量的和因变量的之间的线性的相关关系,分为一元线性回归和多
- 文末附完整源代码实现过程...想实现这样一个功能,然后pyqt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现。说到绘图的话
- 代码示例#输入'''order_id:31489join_course[0][join_tel]:131309998
- 第一次写ASP类,实现功能:分段统计程序执行时间,输出统计表等.程序代码:Class ccClsProcessTimeRecord
- 其实所有的死锁最深层的原因就是一个:资源竞争。表现一:一个用户A 访问表A(锁住了表A),然后又访问表B
- pycharm创建sql文件及模板创建模板pycharm默认新建文件选项中没有sql文件,每次通过文件末尾添加.sql识别文件格式很麻烦。可
- scrapy爬虫框架介绍scrapy不是一个简单的函数功能库,而是一个爬虫框架爬虫框架:爬虫框架是实现爬虫功能的一个软件结构和功能组件的集合
- 如何剔除HTML标识?这里没有使用正则表达式来去除,当然大家用正则"<.+?>"也可以实现这个功能只留下干净
- 看到有人用的PJBlog使用的是自动填写验证码,这样其实也不使用验证码基本上没有什么区别,很容易被 * ,因此在参照许多修改的基础上,找到
- gchart:基于google图表API的jquery组件全攻略——入门gchart是基于google图表API的jquery组件。使用gc
- 在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用来分析XML文档结构的,当然也能分析html结构
- 1、异常简介从软件方面来说,错误是语法或是逻辑上的,当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了
- 今天填一个坑,俄罗斯方块!!俄罗斯方块的移动不难实现,但是旋转就不太容易实现,究其原因是因为Python中没有数组这种数据结构,所以不能用矩
- 在利用QT编写GUI程序时经常需要一些交互操作,常见的有鼠标事件、键盘事件等。今天我们要实现的是在label中已经显示的图像中绘制矩形框,以
- 日一二三四五六'.split('') ['日','一','二
- 目录Tornado是什么安装试试看使用tornado框架来写一个web application总结Tornado是什么学委之前在看Jupyt
- 本文实例讲述了python实现计算资源图标crc值的方法,分享给大家供大家参考。具体方法如下:实现该功能的关键在于解析资源信息,找到icon
- 在给客户做个程序时,突然遇到个问题,就是产品页用户提交视频播放文件时,如何根据提交的网址内的视频格式进行正确的播放呢....郁闷了一会,想好
- 我们都知道Django rest framework这个库,默认只支持批量查看,不支持批量更新(局部或整体)和批量删除。下面我们来讨论这个问