一、学习知识点概要(review)

  1. 原码,反码和补码的定义(二进制表示)
  2. 位运算补充和总结
  3. 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的内容基本完成了,但还有些问题待复盘,希望再接再厉!