【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

 

上一篇:Python知识点总结_【字符串方法、格式化输出、切片】~随时更新【第一篇】
下一篇:Jmeter:性能测试中常见的名词(一)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月14日 15时06分11秒