基本符号
& 与
A | B | L=A & B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
| 或
A | B | L=A | B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
^ 异或
A | B | L=A ^ B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
~ 非
不理解Python的 ~ 运算符 。
~x=-x-1
>> 右移位
<< 左移位
>>> 填充高位
Python 没有此项操作。
注: Python 支持位运算符。
Python 数据保存格式为 10 进制, ^ 异或运算 先变为二进制,异或,保存时又会变成十进制。
Python 数据长度自行判断,不存在溢出,故 1 << 35 != 1 << 3 (C\C++\Java int 只有32位)。
不存在高位补零运算,如需实现此操作,需用 format 函数。
e.g.
>>> '{:08b}'.format(4)
'00 000 100'
注意: format 函数输出结果为字符串
位运算的小用途:
判断奇偶数用 & :
>>> 3 & 1
1
>>> 4 & 1
0
获取二进制位为 0 还是 1 :
>>> a = 5 # 二进制码为101
>>> i = int (input('请输入查询位: '))-1
3
>>> b = 2 ** i
>>> c = a & b
>>> if c != 0 :
c=1
>>> print(c)
1
不用判断语句,求整数绝对值。
此项功能 Python 无法实现,Python符号位不为最高位。其他语言实现思路为 最高位 & 0 。将符号位清空,返回其数值。
查找重复元素
1-1000这1000个数放置在含有1001个元素的数组中,只有唯一的一个元素重复,其它均只出现一次。每个数组空间只能访问一次。设计一个算法,将它找出来。不用辅助存储空间,能否设计一个算法实现?
# 生成1001位数列
import random
A=[]
a=0
for i in range(1,11):
A.append(i)
A.append(random.randint(1,10))
# 解法一
for i in range(len(A)): #1
a=a^A[i]
for i in range(len(A)-1): #2
a=a^A[i]
print(a)
# 偶数个相同异或为0,1和2相加,只有重复数为3个,输出只有重复位。awsl
# 解法二
''' 暴力破解 '''
B=[0]*11
for i in range(len(A)):
B[A[i]]+=1
for i in range(len(B)):
if B[i]>1:
print(i)
以下几题为连续。
计算二进制数中有几个 1
a=int(input())
d=0
for i in range(5):
b=2**i
c=a&b
if c != 0 :
d+=1
print(d)
判断整数是不是 2 的整数次方
if d == 1 :
print('Yes.')
一条语句判断一个整数是不是 2 的整数次方 '''
if (a-1)&a == 0 :
print('Yes')
0~1 浮点实数的二进制表示
给定一个介于 0 和 1 之间的师叔,如 0.625 ,打印它的二进制表示(0.101) 若该数字无法精确地用32位以内的二进制表示,则打印 "ERROR" .
a=float(input('输入小数 :'))
op='0.'
for i in range(32):
a*=2
if a>1:
a-=1
op+='1'
elif a==1:
op+='1'
print(op)
exit(0)
else:
op+='0'
print('ERROR')
出现 k 次与出现 1 次
数组中只有一个数出现了 1 次,其他的数都出现了 k 次,请输出只出现了 1 次的数。
#方便的解法应该是运用:n 个 n 进制数做不进位加法,结果为 0 ,把输入数字转换位 k 进制,再进行不进位相加,最后留下的就是只出现了 1 次的数。但是没有想出 Python 怎样定义 n 进制算法。暴力万岁……
list=list(map(int,input('请输入数组:').split()))
A=[0]*10000
for i in range(len(list)):
A[list[i]]+=1
for i in range(len(A)):
if A[i] == 1 :
print(i)
exit(0)
网友评论