位运算

2020-02-18  本文已影响0人  HaughtyHH

基本符号

& 与

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 支持位运算符。
\qquadPython 数据保存格式为 10 进制, ^ 异或运算 先变为二进制,异或,保存时又会变成十进制。
\qquadPython 数据长度自行判断,不存在溢出,故 1 << 35 != 1 << 3 (C\C++\Java int 只有32位)。
\qquad不存在高位补零运算,如需实现此操作,需用 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 :
\qquad \qquadc=1
>>> print(c)
1

不用判断语句,求整数绝对值。

此项功能 Python 无法实现,Python符号位不为最高位。其他语言实现思路为 最高位 & 0 。将符号位清空,返回其数值。

查找重复元素

1-1000这1000个数放置在含有1001个元素的数组中,只有唯一的一个元素重复,其它均只出现一次。每个数组空间只能访问一次。设计一个算法,将它找出来。不用辅助存储空间,能否设计一个算法实现?

# 生成1001位数列
import random
A=[]
a=0
for i in range(1,11):
\qquadA.append(i)
A.append(random.randint(1,10))
# 解法一
for i in range(len(A)): #1
\qquada=a^A[i]
for i in range(len(A)-1): #2
\qquada=a^A[i]
print(a)
# 偶数个相同异或为0,1和2相加,只有重复数为3个,输出只有重复位。awsl
# 解法二
''' 暴力破解 '''
B=[0]*11
for i in range(len(A)):
\qquadB[A[i]]+=1
for i in range(len(B)):
\qquadif B[i]>1:
\qquad\qquadprint(i)

以下几题为连续。

计算二进制数中有几个 1

a=int(input())
d=0
for i in range(5):
\qquadb=2**i
\qquadc=a&b
\qquadif c != 0 :
\qquad\qquadd+=1
print(d)

判断整数是不是 2 的整数次方

if d == 1 :
\qquadprint('Yes.')

一条语句判断一个整数是不是 2 的整数次方 '''

if (a-1)&a == 0 :
\qquadprint('Yes')

0~1 浮点实数的二进制表示

给定一个介于 0 和 1 之间的师叔,如 0.625 ,打印它的二进制表示(0.101) 若该数字无法精确地用32位以内的二进制表示,则打印 "ERROR" .

a=float(input('输入小数 :'))
op='0.'
for i in range(32):
\quada*=2
\quadif a>1:
\qquada-=1
\qquadop+='1'
\quadelif a==1:
\qquadop+='1'
\qquadprint(op)
\qquadexit(0)
\quadelse:
\qquadop+='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)):
\quadA[list[i]]+=1
for i in range(len(A)):
\quadif A[i] == 1 :
\qquadprint(i)
\qquadexit(0)

上一篇 下一篇

猜你喜欢

热点阅读