位運算題目

2021-09-25 08:16:55 字數 905 閱讀 4509

今天看到牛客網的一些題目,非常經典。解法基本也都很熟悉,所以特地做個總結,後續慢慢補充。

先上題目:

數字中的二進位制有多少個1

這裡的數字並不關心它的符號,所以即便是負數,只需要得到二進位制中1的個數就可以了。但是在python中,對於負數的右移運算,符號位會保留,這樣在執行迴圈語句的右移操作時,首位一直是1會陷入死迴圈。倘若你不清楚這個細節,那麼在下面的**中就很容易超時。

num = int(input().strip())& 0xffffffff

def count_one(num):

count = 0

while num:

num = num&(num-1)

count += 1

return count

print(count_one(num))

第一行是讀取數值,並將其絕對值化。後面的**,就是每次將數字num變為num&(num-1),其目的是每次除去最末位的數字1,成功去掉乙個,我們的結果就加1,直到數字中沒有1,也就是num==0為止。

另外,還有這種解法:

a = int(input())& 0xffffffff

ww = [(a >> i & 1 ) for i in range(32)]

print(sum(ww))

看起來簡潔,事實上需要乙個32大小的額外陣列,迴圈也是固定的32次,沒有我們上面的解法效率高。

還見到了這種解法,兄弟,你是認真的嗎?確定面試官不會給你個白眼。

num = int(input())& 0xffffffff

num = bin(num)

print(str(num).count('1'))

還有很多,有時間慢慢補充。

位運算題目彙總

給你乙個整數陣列 arr 請你將陣列中的元素按照其二進位制表示中數字 1 的數目公升序排序。如果存在多個數字二進位制中 1 的數目相同,則必須將它們按照數值大小公升序排列。請你返回排序後的陣列。輸入 arr 0 1,2 3,4 5,6 7,8 輸出 0,1,2,4,8,3,5,6,7 解釋 0 是唯...

位運算小結及位運算題目小練

按位與運算子 是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1,否則為0。參與運算的數以補碼方式出現。運算規則 0 0 0 0 1 0 1 0 0 1 1 1 舉例 9 00001001 5 00000101 1 00000001 00001001 ...

leetcode 位運算題目彙總 上)

最近在看位運算的知識,十分感嘆於位運算的博大精深,正好leetcode有 bit manipulation 的專題,正好拿來練練手。給出乙個由不同的數字組成的陣列,列舉它的子陣列 子集 這道題我之前用遞迴解過,而且效率還不錯 beat 83.33 解法如下不加詳述了 param nums retur...