位运算和条件循环结构
昨天忘了学位运算,今天补上。位运算有些复杂,但是搞懂计算原理也比较容易。所以尽量去算就好了,难点不能放过!!!
1、位运算
原码、反码、补码
原码是对数字进行二进制转换,1=1,10=2,11=3,100=4,101=5,110=6,111=7,1000=8.
符号位,最高位为符号位,0表示正,1表示负,位运算中,符号参与运算。如:
00000011=3
10000011=-3
反码:正数的反码为原码,负数反码为符号位不变,其余位取反:
如3的反码:00000011
-3的反码: 11111100
补码:正数的补码为原码,负数的补码为反码加1.
如3的补码:00000011
-3的补码: 111111101
按位非操作:
~ :
1、对数字的二进制取补码
2、按位取反(这里的“取反”与“反码”不同),全部取反,0变成1,1变成 0,符号位也取反。
3、取补码
举例:
~3
3的二进制00000011,取补码00000011,按位取反11111100,取补码:因为11111100为负数,所以是其反码+1,11111100的反码10000011,+1为100000100,即为-4.
print(~3,~4,~5,~6,~0)# -4 -5 -6 -7 -1
~-3
-3的二进制10000011,取补码11111101,按位取反00000010,取补码00000010,即为2
print(~-3,~-4,~-5,~-1)# 2 3 4 0
可以理解为~n=-(n+1)
按位与操作
&,取两个数的二进制相同的位置,不同的取0
5&6:00000101&00000110=00000100=4
按位或运算
|,只要对应位有1,就为1
5|6:00000101|00000110=00000111=7
按位异或
^,对应位的数相同就为0,不同为1.
5^6: 00000101 ^ 00000110=00000011=3
异或操作满足交换律和结合律:
A ^ B ^A=A ^ A ^ B=B
按位左移/右移操作
num>>i,将数字num的二进制向右移i位
2>>1,00000010>>1=00000001=1
2<<1,00000010<<1=00000100=4
利用位运算进行快速计算
利用>>,<<计算2的倍数问题
n*2:n<<1
n/2:n>>1
n>>m:n/(2^m)
n<<m:n*(2^m)
利用位运算进行整数集合
一个数的二进制可以看做一个集合(0表示不在集合中,1表示在集合中)
如(1,3,4,8)可以表示为 0100011010
对集合进行操作:
元素与集合之间的操作:
a | (1<<a) 把i插入集合中
a & ~(1<<a) 把从集合中删除
a & (1<<i) 判断i是否属于该集合( 0不属于,非0 属于)
集合与集合之间的操作:
a补 ~a
a交b a&b
a并b a|b
a差b a & (~b)
整数在内存中是以补码的形式存在的,输出也是按照补码输出。
2、条件循环结构
条件语句
if语句
a=3
b=4
if a<b and a>0:
print("y")
else:
print("n")
y
多个if语句:
if a>b:
if a==0:
if b>5:
print(a)
else: print(b)
else: print("y")
else: print("n")
n
assert 关键词
断言,当这个关键词后面的条件为False,程序自动崩溃并抛出AssertionError的异常
循环语句
while语句
a=3
b=4
while a>0:
m=input("please input a number:")
m=int(m)
if m > 0:
print(m)
else:
print("please input a number bigger than 0")
break
else:
print(b)
这里需要在循环语句中加入停止Break,不然程序会一直运行。
for循环
数组:
a=['x','y','z']
for i in a:
print(i)
#
for i in range(len(a)):
print(a[i])
字典:
m={'x':1,'y':2,'z':3}
for key,value in m.items():
print(key,value,sep=':',end=' ')
for key in m.keys():
print(key,end=' ')
for value in m.values():
print(value,end=' ')
x:1 y:2 z:3 x y z 1 2 3
for -else 循环:
当for循环正常执行完的情况下,执行else输出,如果for循环执行了跳出循环的语句,比如break,将不执行else的内容。与while-else一样。
for num in range(1,10):
for i in range(2,num):
if num%i==0:
j=num/i
print("in %d"%(i))
break
else:
print("out %d"%(num))
输出结果为:
out 1
out 2
out 3
in 2
out 5
in 2
out 7
in 2
in 3
range 函数:
range 这个BIF的作用是生成一个从start参数的值开始到stop参数的值结束的数字序列,该序列包含start的值但不包含stop的值。
for i in range(2,9):
print(i)
输出结果为:
2
3
4
5
6
7
8
不包含9。
for i in range(2,9,2):
print(i)
输出结果为:
2
4
6
8
最后一个参数为步长。
enumerate函数
enumerate(sequence, [start=0])
返回枚举对象
a=['x','y','z']
lst=list(enumerate(a))
print(lst)
lst_1=list(enumerate(a,start=2))
print(lst_1)
输出结果为:
[(0, 'x'), (1, 'y'), (2, 'z')]
[(2, 'x'), (3, 'y'), (4, 'z')]
用 enumerate(A) 不仅返回了 A 中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用 enumerate(A, j) 还可以确定索引起始值为 j。
a=['x','y','z']
for i in a:
print('input',i)
print('over')
for i,j in enumerate(a,1):
print(i,'input',j)
print('over')
输出结果为:
input x
input y
input z
over
1 input x
2 input y
3 input z
over
break语句
跳出所在层的循环。
import random
m=random.randint(1,10)
while True:
number=input('please input a number:')
number=int(number)
if number==m:
print('good')
break
else:
print('try again!')
print('over')
猜数字游戏结果:
please input a number:3
try again!
please input a number:3
try again!
please input a number:2
try again!
please input a number:1
try again!
please input a number:7
good
over
continue语句:
continue终止本轮循环并开始下一轮循环。
for i in range(1,10):
if i%2!=0:
print(i)
continue
i=i+10
print(i)
输出:
1
12
3
14
5
16
7
18
9
pass语句:
pass 语句的意思是“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而 pass 语句就是用来解决这些问题的。
def fun(x):
pass
推导式:
x=[-3,-2,0,2,3]
y=[a**3 for a in x]
z=[i**2 for i in range(10)]
m=[(i,i**2) for i in range(10)]
n=[i for i in range(10) if (i%2==0) and (i%3==0)]
p=[[i,j] for i in range(2) for j in range(3)]
q=[[i,j] for i in range(3) if i>1 for j in range(5) if j>i ]
print(y,'\n',z,'\n',m,'\n',n,'\n',p,'\n',q)
输出结果为:
x=[-3,-2,0,2,3]
y=[a**3 for a in x]
z=[i**2 for i in range(10)]
m=[(i,i**2) for i in range(10)]
n=[i for i in range(10) if (i%2==0) and (i%3==0)]
p=[[i,j] for i in range(2) for j in range(3)]
q=[[i,j] for i in range(3) if i>1 for j in range(5) if j>i ]
print(y,'\n',z,'\n',m,'\n',n,'\n',p,'\n',q)
字典推导式:
b={i: i%2==0 for i in range(10) if i%3==0}
print(b)
输出:
{0: True, 3: False, 6: True, 9: False}
集合推导式:
c={i for i in [1,2,3,43,2,12,2]}
print(c)
结果为:
{1, 2, 3, 43, 12}
今天学的比较多,多练习才能好好掌握!!加油