
【Python练习题第一天】【简单】对“或”,“与”,“异或”,“非”,位移运算符,取反,补码,反码,源码的扩充
发布日期:2021-05-07 14:07:27
浏览次数:16
分类:精选文章
本文共 2668 字,大约阅读时间需要 8 分钟。
今天的练习题:来自Edabit,简单的逻辑的运算符:
分别用逻辑与,逻辑或,逻辑异或,来计算:
小菜鸟我的代码:
def bitwise_and(n1, n2): return n1 & n2def bitwise_or(n1, n2): return n1 | n2def bitwise_xor(n1, n2): return n1 ^ n2
大神的代码:
def bitwise_and(n1, n2): n1 = '0'*(8-len('{0:b}'.format(n1))) + '{0:b}'.format(n1) n2 = '0'*(8-len('{0:b}'.format(n2))) + '{0:b}'.format(n2) return int(''.join('1' if n1[i]=='1' and n2[i]=='1' else '0' for i in range(8)), 2)def bitwise_or(n1, n2): n1 = '0'*(8-len('{0:b}'.format(n1))) + '{0:b}'.format(n1) n2 = '0'*(8-len('{0:b}'.format(n2))) + '{0:b}'.format(n2) return int(''.join('1' if n1[i]=='1' or n2[i]=='1' else '0' for i in range(8)),2)def bitwise_xor(n1, n2): n1 = '0'*(8-len('{0:b}'.format(n1))) + '{0:b}'.format(n1) n2 = '0'*(8-len('{0:b}'.format(n2))) + '{0:b}'.format(n2) return int(''.join('1' if int(n1[i]) + int(n2[i])==1 else '0' for i in range(8)),2)
一、对知识的理解,和储备
逻辑运算符及符合表示 | 解释说明 |
或(" | ") | 有1结果就为1,全0为0(可以用来统计偶数) |
与(" &" ) | 全部相同(0/1)为1,不相同(0/1)为0 (可以用来判断奇数) |
异或(" ^ ") | 全部相同(0/1)为0,不相同(0/1)为1 (可以统计不相同的数) |
非(" ! ") | 非Truen则False,非False则Ture。(偶数个(" !! ")不改变原来的数) |
左位移(" << ") | 左边最高位丢弃,右边补0(左移向左,移动几位就是乘以2的几次幂) |
右位移(“ >> ”) | 最高位是0,左边补齐为0;最高位是1,左边补1(右移向右,移动几位就是除以2的几次幂) |
按位取反(“ ~ ”) | 对补码进行取反 |
二、对 " 或 " 的解释
或(" | ") | 有1结果就为1,全0为0,(可以用来统计偶数) |
字符 A | 字符 B | 结果 |
1 | 0 | 1 |
0 | 0 | 0 |
1 | 1 | 1 |
三、对” 异 “的解释
与(" &" ) | 全部相同(0/1)为1,不相同(0/1)为0 (可以用来判断奇数) |
字符 A | 字符 B | 结果 |
1 | 0 | 0 |
0 | 0 | 0 |
1 | 1 | 1 |
四、为什么可以用来判断偶数尼?(全为0)(不相同为0)这两句话来说的,
我们大家都是8421码,一个字节用八位表示,用二进制表示法为
2^7 | 2^6 | 2^5 | 2^4 | 2^3 | 2^2 | 2^1 | 2^0 |
128 | 64 | 32 | 16 | 16 | 4 | 2 | 1 |
从上表可以看出,只有8为字节中,最后一位时奇数,剩下的都偶数,因此我们 就用1来判断 ,
当我们来做用与(" & ") :代码:
for i in range (100): if i & 1 == 1: print("奇数有:",str(i)) elif i & 1 == 0: print("偶数有:",str(i))
五、对异或(" ^ ")的解释
异或(" ^ ") | 全部相同(0/1)为0,不相同(0/1)为1 (可以统计不相同的数) |
用代码来实现:
a = [1,3,46,7,8,2]b = [1,2,4]for i in a: for j in b: if i ^ j == 0: print("相同的数有:",str(j))
六、对非" ! "
非(" ! ") | 非Truen则False,非False则Ture。(偶数个(" !! ")不改变原来的数) |
七、左移位(" << ")
左位移(" << ") | 左边最高位丢弃,右边补0(左移向左,移动几位就是乘以2的几次幂) |
>>> 2 << 316
也就相当于2^3=16
八、左移位(" >> ")
右位移(“ >> ”) | 最高位是0,左边补齐为0;最高位是1,左边补1(右移向右,移动几位就是除以2的几次幂) |
>>> 16 >> 32
也就相当于log以2为底数,16的对数,
为什么左移的时候要考虑符号,而右移动,不考虑符号
九、按位取反(" ~ ")
按位取反(“ ~ ”) | 对补码进行取反 |
在介绍按位取反的时候我还是先给大家讲解一些,知识点,计算计算的都是按照补码来进行运算的,简单理解就是为了避免,在开发一套复杂的减法的运算程序(大部分人还是喜欢加法),→
什么叫做补码,还是要解释什么叫做源码,反码,补码?
源码:
- 就是二进制制定点表示法,即最高位为符号位,"0"表示正,"1"表示为负,其余位表示数值的大小。
- 通过一个字节,也就是8个二进制位表示+7和-7
- 0(符号位)0000111
- 1(符号位)0000111
反码:
- 正数的反码与其源码相同;
- 负数的反码是对其源码逐位取反,但符号位不变;
补码:
- 正数的补码与其源码相同;
- 负数的补码是在其反码的末尾加1
十进制 | 二进制 | 源码 | 反码 | 补码 |
9 | 0000 1001 | 0000 1001 | 0000 1001 | 0000 1001 |
-7 | 1000 0111 | 1000 0111 | 1111 1000 | 1111 1001 |
按位取反,例子(~-6)
十进制 | 二进制 | 补码 | 取反后的补码 | 反码 | 源码 | 结果 |
-6 | 1000 0110 | 1111 1010 | 0000 0101 | 0000 0101 | 0000 0101 | 5 |
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月14日 15时06分11秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
内存分配-slab分配器
2019-03-06
技术写作技巧分享:我是如何从写作小白成长为多平台优秀作者的?
2019-03-06
Jupyter Notebook 暗色自定义主题
2019-03-06
[Python学习笔记]组织文件
2019-03-06
基于Redo Log和Undo Log的MySQL崩溃恢复流程
2019-03-06
如何正确的在项目中接入微信JS-SDK
2019-03-06
纵览全局的框框——智慧搜索
2019-03-06
快服务流量之争:如何在快服务中占领一席之地
2019-03-06
【活动】直播揭秘<如何从0开发HarmonyOS硬件>
2019-03-06
Unity平台 | 快速集成华为性能管理服务
2019-03-06
对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
2019-03-06
使用Power BI构建数据仓库与BI方案
2019-03-06
Django认证系统并不鸡肋反而很重要
2019-03-06
tep用户手册帮你从unittest过渡到pytest
2019-03-06
12张图打开JMeter体系结构全局视角
2019-03-06
Spring Boot 2.x基础教程:构建RESTful API与单元测试
2019-03-06
[UWP 自定义控件]了解模板化控件(1):基础知识
2019-03-06
UWP 自定义控件:了解模板化控件 系列文章
2019-03-06
[UWP]从头开始创建并发布一个番茄钟
2019-03-06
WinUI 3 Preview 3 发布了,再一次试试它的性能
2019-03-06