基本符號(hào)
& 與
| 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的 ~ 運(yùn)算符 。
~x=-x-1
>> 右移位
<< 左移位
>>> 填充高位
Python 沒有此項(xiàng)操作。
注: Python 支持位運(yùn)算符。
Python 數(shù)據(jù)保存格式為 10 進(jìn)制, ^ 異或運(yùn)算 先變?yōu)槎M(jìn)制,異或,保存時(shí)又會(huì)變成十進(jìn)制。
Python 數(shù)據(jù)長(zhǎng)度自行判斷,不存在溢出,故 1 << 35 != 1 << 3 (C\C++\Java int 只有32位)。
不存在高位補(bǔ)零運(yùn)算,如需實(shí)現(xiàn)此操作,需用 format 函數(shù)。
e.g.
>>> '{:08b}'.format(4)
'00 000 100'
注意: format 函數(shù)輸出結(jié)果為字符串
位運(yùn)算的小用途:
判斷奇偶數(shù)用 & :
>>> 3 & 1
1
>>> 4 & 1
0
獲取二進(jìn)制位為 0 還是 1 :
>>> a = 5 # 二進(jìn)制碼為101
>>> i = int (input('請(qǐng)輸入查詢位: '))-1
3
>>> b = 2 ** i
>>> c = a & b
>>> if c != 0 :
c=1
>>> print(c)
1
不用判斷語句,求整數(shù)絕對(duì)值。
此項(xiàng)功能 Python 無法實(shí)現(xiàn),Python符號(hào)位不為最高位。其他語言實(shí)現(xiàn)思路為 最高位 & 0 。將符號(hào)位清空,返回其數(shù)值。
查找重復(fù)元素
1-1000這1000個(gè)數(shù)放置在含有1001個(gè)元素的數(shù)組中,只有唯一的一個(gè)元素重復(fù),其它均只出現(xiàn)一次。每個(gè)數(shù)組空間只能訪問一次。設(shè)計(jì)一個(gè)算法,將它找出來。不用輔助存儲(chǔ)空間,能否設(shè)計(jì)一個(gè)算法實(shí)現(xiàn)?
# 生成1001位數(shù)列
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)
# 偶數(shù)個(gè)相同異或?yàn)?,1和2相加,只有重復(fù)數(shù)為3個(gè),輸出只有重復(fù)位。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)
以下幾題為連續(xù)。
計(jì)算二進(jìn)制數(shù)中有幾個(gè) 1
a=int(input())
d=0
for i in range(5):
b=2**i
c=a&b
if c != 0 :
d+=1
print(d)
判斷整數(shù)是不是 2 的整數(shù)次方
if d == 1 :
print('Yes.')
一條語句判斷一個(gè)整數(shù)是不是 2 的整數(shù)次方 '''
if (a-1)&a == 0 :
print('Yes')
0~1 浮點(diǎn)實(shí)數(shù)的二進(jìn)制表示
給定一個(gè)介于 0 和 1 之間的師叔,如 0.625 ,打印它的二進(jìn)制表示(0.101) 若該數(shù)字無法精確地用32位以內(nèi)的二進(jìn)制表示,則打印 "ERROR" .
a=float(input('輸入小數(shù) :'))
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')
出現(xiàn) k 次與出現(xiàn) 1 次
數(shù)組中只有一個(gè)數(shù)出現(xiàn)了 1 次,其他的數(shù)都出現(xiàn)了 k 次,請(qǐng)輸出只出現(xiàn)了 1 次的數(shù)。
#方便的解法應(yīng)該是運(yùn)用:n 個(gè) n 進(jìn)制數(shù)做不進(jìn)位加法,結(jié)果為 0 ,把輸入數(shù)字轉(zhuǎn)換位 k 進(jìn)制,再進(jìn)行不進(jìn)位相加,最后留下的就是只出現(xiàn)了 1 次的數(shù)。但是沒有想出 Python 怎樣定義 n 進(jìn)制算法。暴力萬歲……
list=list(map(int,input('請(qǐng)輸入數(shù)組:').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)