一、学习知识点概要(review)
- 原码,反码和补码的定义(二进制表示)
- 位运算补充和总结
- bin()函数
二、学习内容(record)
1.原码、反码和补码
对于正数本身,其反码和补码都是本身
'''比如说:
正数3的二进制表示:00000011,即3的原码;000000011也是3的反码和补码
则-3的二进制表示,10000011,即原码
正负数最高位不同,1代表负数,0代表负数。
'''
那么对于负数呢?
负数的反码就是最高位(符号位)不变,其余位取反
'''我们以-4为例
-4的原码:10000100
则其反码就是:11111011
'''
负数的补码就是反码+1
"""以-5为例
-5的原码是10000101
其反码就是11111010
则补码就为11111011
"""
2.位运算
<<代表按位左移,>>代表按位右移
在我昨天第四模块中也对位运算进行一些反思
对于3>>2按位右移运算原则是,将00000011向右移两位,低位舍弃(舍弃11),高位补0(负数补1),则变成00000000,所以3>>2输出0
对于3<<2运算按位左移运算原则是,将00000011向左移两位,全部二进制数整体向左移,高位舍弃,低位补0,则变成00001100,所以3<<2输出12
'''对于负数,按位左移运算高位不变,仍为1
对于运算-4 << 1
即将10000100往左移1位,变成10001000
所以-4 << 1 输出结果为-8
'''
对于按位运算,m<<n可以代表m乘以2的n次方,m>>n可以代表m除以2的n次方
#举个例子
4<<2即4*2的平方=4*4=16
8>>2即8/2的平方=8/4=2
因此<<和>>可以实现2的倍数运算
3.补充:位运算之异或运算的性质
异或运算:a^b,a与b不同,输出结果为1;a与b相同,则输出结果为0。
异或运算的性质:
'''
交换律,即 a ^ b ^ c = a ^ c ^ b
结合律, 即 (a ^ b) ^ c = a ^ ( b ^c )
对于任何数,都有 a ^ a = 0, a ^ 0 = a
自反性, a ^ b ^ b = a ^ 0 = a
'''
从上面可以看出任何数与其本身异或运算的结果为0,;而任何数与0异或运算的结果为其本身
4.利用位运算实现整数集合
一个数的二进制表示可以看做是一个集合
如集合a={6,3,5,2}可以表示成0001101100即0b1101100;
元素与集合(set)的应用:从集合中插入和删除,和判断某元素是否在集合中
插入新元素:
#在集合a中添加1
#a={6,3,5,2}
a=0b1101100
b=a|(1<<1)
print(bin(b))
#0b1101110
删除某元素
#在集合中将6删除
a=0b1101100
b=a&~(1<<6)
print(bin(b))
#输出0b101100
判断某元素是否在集合中
#判断3,5是否在集合a中
a=0b1101100
print(a&(1<<4))
print(a&(1<<5))
'''
输出
0
32
'''
集合之间的操作:(集合常见运算)
a 对称b -> a^b(全集减去a与b的交集)
a 交 b -> a & b
a 并 b -> a | b
a 差 b -> a-b
a = set([1,5,9,6])
b = set([2,5,7,3])
print(a&b)#交集
print(a|b)#并集
print(a^b)#对称集
print(a-b)#差集
'''
输出:
{5}
{1, 2, 3, 5, 6, 7, 9}
{1, 2, 3, 6, 7, 9}
{1, 9, 6}
'''
在这里拓展一下集合(set)的有关内容:
集合与元组,列表类似,但它具有无序性(高中接触过的集合),不重复性(互异性),它能有效地去除重复元素。
对于 python 中列表 list、tuple 类型中的元素,转换集合是会去掉重复的元素,并对它进行排序(升序)
#集合初始化
a = set([1,5,6,3,5,9])
a
#输出:{1, 3, 5, 6,9}
集合的添加与删除:add方法添加元素
a = {2,5,6,8}
a.add(4)
a
#输出:{2, 4, 5, 6, 8}
pop、remove和discard方法删除元素
#pop方法
a = {1,6,8,4}
a.pop()
a
#pop方法删除该元素后会返回该元素的值,但pop()删除并返回的是任意一个集合中的元素
#输出:{1.4,6}
#再举一个例子
b = {5,6,7,9}
b.pop()
b
#输出:{5,6,7}
pop方法对于是字典和字符转换的集合是随机删除元素的。当集合是由列表和元组组成时、set.pop() 是从左边删除元素的如下:
a = set([1,6,8,4,3])
a.pop()
a
#输出:{3,4,6,8}
remove方法
#remove方法
a = {2,5,6,8}
a.remove(5)
a
#输出:{2, 6, 8}
discard方法
和remove方法类似,不再举例;但与remove方法相比,,如果你试图删除一个集合中不存在的值,系统不会返回「KeyError」
5.Python中的bin()输出
print(bin(3))
#输出0b11
print(bin(-3))
#输出-0b11
可以看到bin(负数)输出的是它的正数的原码前加一个负号(注意)
三、学习问题与解答(analysis)
LeetCode练习题:一开始利用位运算找出只出现一次的数字仍没有头绪
经上网查询,知道使用异或运算将数组内所有值取异或,最后出现的就是要找的数字。
原理:任何数与其本身异或为0;0与任何数异或为其本身;异或运算满足交换律和结合律
四、学习思考与总结(summary)
task1的内容基本完成了,但还有些问题待复盘,希望再接再厉!