位運算
利用位運算實現快速計算
通過^
快速交換兩個整數
a = a^b
b = a^b # b = (a^b)^b = a
a = a^b # a = (a^b)^a = b
通過a & (-a)
快速獲取a
的最後為 1 位置的整數。
00
000101-
>5&
1111
1011
->-5
---00
000001-
>100
001110-
>14&
1111
0010
->-14
---00
000010-
>
2
利用位運算實現整數集合
乙個數的二進位制表示可以看作是乙個集合(0 表示不在集合中,1 表示在集合中)。
比如集合,可以表示成
01 00 01 10 10
而對應的位運算也就可以看作是對集合進行的操作。
元素與集合的操作:
a |(1
<#把 i 插入到集合中
a &~(1
<#把 i 從集合中刪除
a &(
1<#判斷 i 是否屬於該集合(零不屬於,非零屬於)
集合之間的操作:
~a #a補
a & b #a交b
a | b #a並b
a &(
~b)#a差b
注意:整數在記憶體中是以補碼的形式存在的,輸出自然也是按照補碼輸出。
【例】python 的bin()
輸出。
print
(bin(3
))# 0b11
print
(bin(-
3))# -0b11
print
(bin(-
3&0xffffffff))
# 0b11111111111111111111111111111101
print
(bin
(0xfffffffd))
# 0b11111111111111111111111111111101
print
(0xfffffffd
)# 4294967293
從結果可以看出:
所以為了獲得負數(十進位制表示)的補碼,需要手動將其和十六進製制數0xffffffff
進行按位與操作,再交給bin()
進行輸出,得到的才是負數的補碼表示。
練習題leetcode 習題 136. 只出現一次的數字
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
嘗試使用位運算解決此題。
題目說明:
"""
input file
example1: [2,2,1]
example2: [4,1,2,1,2]
output file
result1: 1
result2: 4
"""class
solution
(object):
defsinglenumber
(self, nums)
:"""
:type nums: list[int]
:rtype: int
"""output =
0for i in
range
(len
(nums)):
output = output^nums[i]
return output
python學習筆記 day2
函式之間或類的方法之間使用空行分隔,表示乙個新的開始,類和函式入口之間也用空行分隔。空格不是語法的一種,但是最好這樣做,為了方便閱讀和日後的維護 input n按下enter後退出 n value input n請輸入 n print value 接收輸入的資訊並列印python支援同一行內編寫多行...
Python學習筆記 Day2
在python中,for迴圈的功能十分強大,使用起來有些類似c 中的auto型別有些類似 for iterator in sequence 基本形式,iterator的型別和sequence的元素型別相同 for i in hello world print i 輸出字串中的每乙個字元 prime ...
Python學習筆記(day2) 雜談
今天看的知識挺雜的,主要還是集中在判斷語句和列表這一部分 分割線 1 多重判斷 if 和 elif 之間的區別在於占用記憶體不同。多個 if 要求電腦不斷重複判斷,而elif只需要一次判斷。大大提高了電腦讀寫 的速度 2 自增和自減運算。熟練掌握p 2,p 2的含義 3 input 只能接受乙個引數...