Python : 位运算 —— 与、或、异或、左移、右移

位运算

位运算是把数字用 二进制 表示之后,对每一位上 0 或者 1 的运算。位运算共有 5 种运算:与、或、异或、左移、右移。

与、或、异或的运算规律:

与 ( & )

或 ( | )

异或 ( ^ )

0 & 0 = 0

0 | 0 = 0

0 ^ 0 = 0

0 & 0 = 0

1 | 0 = 1

1 ^ 0 = 1

0 & 0 = 0

0 | 1 = 1

0 ^ 1 = 1

0 & 0 = 0

1 | 1 = 1

1 ^ 1 = 0

左移:

左移运算符 m << n 表示把 m 左移 n 位。在左移 n 位的时候,最左边的 n 位将被丢弃,同时在最右边补上 n 个 0 。比如:

00001010 << 2 = 00101000

10001010 << 3 = 01010000

Python 代码【结果有点不一样】:

>>> bin(int('0b00001010', 2) << 2).replace('0b', '').zfill(8)

'00101000'

>>> bin(int('0b10001010', 2) << 3).replace('0b', '').zfill(8)

'10001010000'

>>> bin(-int('0b00001010', 2) << 2).replace('0b', '').zfill(8)

'-0101000'

右移:

右移运算符 m >> n 表示把 m 右移 n 位。在右移 n 位的时候,最右边的 n 位将被丢弃。但右移时处理最左边位的情形要复杂一点。如果数字是一个无符号树值,则用 0 填补最左边的 n 位;如果数字是一个有符号数值,则用数字的符号位填补最左边的 n 位。也就是说,如果数字原先是一个正数,则右移之后在最左边补 n 个 0 ;如果数字原先是负数,则右移之后在最左边补 n 个 1 。下面是对两个 8 位有符号数进行右移的例子:

00001010 >> 2 = 00000010

10001010 >> 3 = 11110001

Python 代码【结果有点不一样】:

>>> bin(int('0b10001010', 2) >> 2).replace('0b', '').zfill(8)

'00100010'

>>> bin(int('0b10001010', 2) >> 3).replace('0b', '').zfill(8)

'00010001'

>>> bin(-int('0b10001010', 2) >> 3).replace('0b', '').zfill(8)

'-0010010'

应用:二进制中 1 的个数

问题: 请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001 ,有 2 位是 1 。因此,如果输入 9 ,该函数输出 2

分析: 如果整数不等于 0 ,那么该整数的二进制表示中至少有 1 位是 1 。

先假设这个数的最右边一位是 1 ,那么该数减去 1 后,最右边一位变成了0,其他位不变;

再假设最后一位不是 1 而是 0 ,而最右边的 1 在第 m 位,那么该数减去 1 ,第 m 位变成 0 , m 右边的位变成 1 , m 之前的位不变;

上面两种情况总结,一个整数减去 1 ,都是把最右边的 1 变成 0 ,如果它后面还有 0 ,那么 0 变成 1 。那么我们把一个整数减去 1 ,与该整数做位运算,相当于把最右边的 1 变成了 0 ,比如 1100 与 1011 做位与运算,得到 1000 。那么一个整数中有多少个 1 就可以做多少次这样的运算。

# -*- coding: utf-8 -*-

"""

Created on 20-7-1

@author: eln

@requirements: PyCharm 2017.2; Python 3.5.5 |Anaconda 5.1.0 (64-bit)

@decription: 二进制中 1 的个数

"""

def hamming_weigth(n: int) -> int:

"""

一个数 n 和 它-1 做与运算,就相当于干掉了最右边的 1 .

"""

bits = 0

while n:

bits += 1

n = (n-1) & n

return bits

if __name__ == '__main__':

print(hamming_weigth(11)) # 3

print(all(bin(n).count('1') == hamming_weigth(n) for n in range(30))) # True

一些测试代码

# -*- coding: utf-8 -*-

"""

Created on 20-6-19

@author: eln

@requirements: PyCharm 2017.2; Python 3.5.5 |Anaconda 5.1.0 (64-bit)

@decription: python 二进制操作

"""

# 字符串转二进制后进行位移操作

print(bin(int('0b10001010', 2) >> 3).replace('0b', '').zfill(8))

# Python 二进制、整数相互转化 https://blog.csdn.net/a1628864705/article/details/52884441

# python 的按位与、或、异或 运算 https://www.cnblogs.com/xioawu-blog/p/11208066.html

for i in range(16):

test_bin = bin(i).replace('0b', '').zfill(4) # 整数转二进制字符串, zfill 整数补 0 , [左, 中, 中, 右]

test_int = int(test_bin, 2) # 二进制转整数

step = 2

test = [test_bin[i:i + step] for i in range(0, len(test_bin), step)] # 将一组数分成每 N 个一组, [左中, 中右]

test_b = int(test[0], 2) & int(test[1], 2)

print(str(i).zfill(2), test_bin, str(test_int).zfill(2), " ",

test, bin(test_b).replace('0b', '').zfill(2), "即", int(test[0], 2), "&", int(test[1], 2), "=", test_b)

# if int(test[0], 2) > 1 and int(test[1], 2) in [1, 3]: # 左,右均为 1 的所有组合

# print(" ", "这是左,右均为 1 的组合:", str(i).zfill(2), test)

step = 1

test2 = [test_bin[i:i + step] for i in range(0, len(test_bin), step)] # 将一组数分成每 N 个一组, [左, 中, 中, 右]

# if int(test2[0]) == 1 and int(test2[3]) == 1: # 左,右均为 1 的所有组合

# print(" ", "这是左,右均为 1 的组合:", str(i).zfill(2), test)

for j in range(16):

b1 = i | j # 二进制按位 或 | ,两个位都为 0 时,结果才为 0

b2 = i & j # 二进制按位 与 & ,两个位都为 1 时,结果才为 1

b3 = i ^ j # 二进制按位 异或 ^ ,两个位相同为 0 ,相异为 1

# print(" ", bin(i).replace('0b', '').zfill(4), "|", bin(j).replace('0b', '').zfill(4), "=",

# bin(b1).replace('0b', '').zfill(4), "即", str(i).zfill(2), "|", str(j).zfill(2), "=", str(b1).zfill(2),

# " ", bin(i).replace('0b', '').zfill(4), "&", bin(j).replace('0b', '').zfill(4), "=",

# bin(b2).replace('0b', '').zfill(4), "即", str(i).zfill(2), "&", str(j).zfill(2), "=", str(b2).zfill(2),

# " ", bin(i).replace('0b', '').zfill(4), "^", bin(j).replace('0b', '').zfill(4), "=",

# bin(b3).replace('0b', '').zfill(4), "即", str(i).zfill(2), "^", str(j).zfill(2), "=", str(b3).zfill(2))

执行结果:

/home/eln/anaconda3/envs/eln35/bin/python3.5 /home/eln/PycharmProjects/SphinxDoc/_test/test_bin.py

00010001

00 0000 00 ['00', '00'] 00 即 0 & 0 = 0

01 0001 01 ['00', '01'] 00 即 0 & 1 = 0

02 0010 02 ['00', '10'] 00 即 0 & 2 = 0

03 0011 03 ['00', '11'] 00 即 0 & 3 = 0

04 0100 04 ['01', '00'] 00 即 1 & 0 = 0

05 0101 05 ['01', '01'] 01 即 1 & 1 = 1

06 0110 06 ['01', '10'] 00 即 1 & 2 = 0

07 0111 07 ['01', '11'] 01 即 1 & 3 = 1

08 1000 08 ['10', '00'] 00 即 2 & 0 = 0

09 1001 09 ['10', '01'] 00 即 2 & 1 = 0

10 1010 10 ['10', '10'] 10 即 2 & 2 = 2

11 1011 11 ['10', '11'] 10 即 2 & 3 = 2

12 1100 12 ['11', '00'] 00 即 3 & 0 = 0

13 1101 13 ['11', '01'] 01 即 3 & 1 = 1

14 1110 14 ['11', '10'] 10 即 3 & 2 = 2

15 1111 15 ['11', '11'] 11 即 3 & 3 = 3

Process finished with exit code 0

原文链接:https://blog.csdn.net/enland_lan/article/details/107076700

python左移右移位运算_荐Python : 位运算 —— 与、或、异或、左移、右移相关推荐

  1. python 二维强度图_荐 python数据分析matplotlib库使用之二维图形绘制

    本篇内容会在后期不定时更新 什么是matplotlib matplotlib是最流行的python底层绘图库,主要做数据可视化图表. 为什么要学习matplotlib 能将数据进行可视化,更直观的呈现 ...

  2. 设计一个程序实现两个任意长的整数的求和运算_深入 Python (7) Karatsuba 实现长整数乘法...

    Python 的长整数乘法使用了 Karatsuba 算法,昨天写的比较粗,今天仔细研究了下它的实现,真是妙啊. 多项式乘法 在一切开始之前,需要回顾多项式乘法公式: (a + b)(c + d) = ...

  3. python 小括号 运算_浅析python 中大括号中括号小括号的区分

    python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ }.其作用也各不相同,分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ): ...

  4. python计算存款复利计算器_《Python核心编程》第五章:数字

    本章大纲 介绍Python支持的多种数字类型,包含:整型.长整型.布尔型.双精度浮点型.十进制浮点型和复数. 介绍和数字相关的运算符和函数. 知识点 5.1 布尔型 从Python2.3開始支持boo ...

  5. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  6. python科学计数法转换_对比Python学习Go 基本数据结构

    公众号文章不方便更新,可关注底部「阅读原文」博客,文章随时更新. 本篇是「对比 Python 学习 Go」[1] 系列的第三篇,本篇文章我们来看下 Go 的基本数据结构.Go 的环境搭建,可参考之前的 ...

  7. python十大必备知识_学Python必备的基础知识

    学Python必备的基础知识 1.基本概念 表达式:就是一个类似于数学公式的东西,一般仅仅用了计算一些结果 ,不会对程序产生实质性的影响,如9+3; 语句:在程序中语句一般需要完成某种功能,比如打印信 ...

  8. 初中python编程初步教学设计_初中Python程序设计顺序结构教学设计方案.docx

    教学设计方案一<顺序结构程序设计> 一.教学目标 (1)知识与技能 能够根据问题分析,设计顺序结构程序的算法 能够运用顺序结构,使用 Python程序编写.调试并运行代码 (2)过程与方法 ...

  9. python怎么做软件程序_看 Python 超级程序员使用什么开发工具

    Python超级程序员使用的开发工具 我以个人的身份采访了几个顶尖的Python程序员,问了他们以下5个简单的问题: 当前你的主要开发任务是什么? 你在项目中使用的电脑是怎样的? 你使用什么IDE开发 ...

最新文章

  1. location.search
  2. Node.js Web 开发框架大全《中间件篇》
  3. 用Python盘点那些豆瓣评分低于3.0的奇葩电影
  4. linux系统软件包依赖关系,Ubuntu解决包依赖关系
  5. scheme中文编程
  6. 看电影学英语:不速之客[The Vistor] [二]
  7. 【渝粤教育】国家开放大学2018年春季 0688-22T老年精神障碍护理 参考试题
  8. 18.Argument replacement
  9. 用Cocos2d-x-3.0及Box2d预测物体弹道轨迹
  10. 指纹识别的原理和方法
  11. 《Python》re模块补充、异常处理
  12. 金九银十,测试思维面试题最新整理!
  13. Windows 11 任务栏、菜单栏无故消失解决方案
  14. 操作系统-用信号量解决过独木桥问题
  15. 手机端页面测试神器--Browsersync
  16. OpenCV:mask的作用,如何制作掩模mask
  17. python爬虫课程笔记
  18. Photoshop CC 2017 For Mac安装教程
  19. cuda remove
  20. 游戏盾是怎么保护游戏被攻击的高防IP又是如何防御的

热门文章

  1. Vue | Vue.js 实现过渡动画
  2. 怎样直接下载网页中的视频
  3. 2021年安全员-C证(广西省-2021版)考试APP及安全员-C证(广西省-2021版)模拟考试
  4. 麒麟信安加入“商用密码证书可信计划” ,携手奇安信共筑国密生态安全
  5. 线上拼团的活动方案设计的注意事项
  6. 电影院移动端APP更新 观众迎来掌上的社交看电影
  7. GRBL三:gcode代码解析
  8. parse_args()和parse_known_args()的用法和区别
  9. 64位Win10下python调用dll出错
  10. 跟心爱的人表白吧 express Love