面試中會遇到很多與位運算相關的題目,在這裡對位運算的相關知識點和遇到的一些題目總結一下。
二進位制的5種位運算:
與(&)
或(|)
異或(^)
左移(<<) : m《右移(>>):m>>n表示 把m右移n位 最右邊的n為會被丟棄,如果數值原來是個正數,用0補上最左邊的n位,如果是乙個負數,則最左邊補上n個1;
題型一:進製轉換
微軟產品excel中,用a表示第1列,b表示第2列……z表示第26列,aa表示第27列,ab表示第28列……以此類推。請寫出乙個函式,輸入字母表示的列號編碼,輸出它是第幾列。
本質上是把十進位制數字用a-z表示成二十六進製制。
題型二:二進位制中1的個數
題目描述:實現乙個函式,輸入乙個整數,輸出這個數字二進位制中表示1的個數。如,把9表示成二進位制是1001,有2個1。因此輸入9,函式輸出為2。
一種典型的想法是,利用迴圈,每次將數字n與1做位與(&)運算,檢驗最優以為是不是1,然後將數字n右移一位,迴圈終止條件為n為0;
這種思想的問題在於,如果n為負數,在右移操作時,最左邊將會用1填充,則會陷入死迴圈中。
另外,不要使用除法來代替位運算,雖然右移一位與除以2效果等價,但是除法效率比移位運算低很多。
換一種思路避免死迴圈:
每次把數字n與1進行位與運算,判斷n的最低位是不是1,,然後1左移一位,再和n位與,判斷n的次低位是不是1;
這樣的想法,迴圈的次數是整數二進位制的位數;迴圈的次數有點兒多啊;
改進一下,n中有幾個1就迴圈幾次的演算法:
乙個規律,乙個整數減去1,再與原整數做與運算,即:n &(n-1)會將該整數的從右邊數第乙個1變成0,這樣該整數中有幾個1就迴圈幾次,直至把該整數中的1都變成0;
題型三:一條語句判斷乙個整數是不是2的整數次方
利用上乙個題中最後的思路,因為分析可知,如果乙個整數是2的整數次方,則其二進位制表示中,有且僅有乙個1,所以,只要利用 n&(n-1) 判斷其值是否為0即可;
題型四:乙個數字改變幾位得到另乙個數字:
題目描述:輸入兩個整數m和n,計算需要改變m的二進位制中的多少位能得到n。比如10的二進位制表示為1010,13的二進位制位1101,需要改變3位。
解決該問題可以分為兩步,首先m和n進行異或,然後統計異或的結果中有多少個1,,方法見題型二
題型五:陣列中數字出現的次數
題目一:陣列中只出現一次的乙個數字
乙個整型陣列中,除了乙個數字外,其他數字都出現了兩次,請寫出程式找出這乙個只出現一次的數字。要求時間複雜度為o(n),空間複雜度為o(1)
利用異或運算的乙個性質,即與自身相異或,結果都為0。所以從頭到尾依次異或陣列中的每個數字,最終的結果剛好是那個只出現乙個的數字。
題目二:陣列中只出現一次的兩個數字
乙個整型陣列中,除了兩個數字外,其他數字都出現了兩次,請寫出程式找出這兩個只出現一次的數字。要求時間複雜度為o(n),空間複雜度為o(1)
如果像上一題一樣,所有的數字一次異或,得到的結果是兩個出現一次的數字相異或的結果。根據這個結果,找出該數字從右數第乙個1,根據這一位是1還是0,將原陣列中的數字分為兩組,兩組中各包含了乙個只出現一次的數字。然後利用上一題的思路,分別異或,就能把只出現一次的兩個數字找出來。
題目三:陣列中唯一只出現一次的數字
在乙個陣列中,除了乙個數字只出現乙個外,其餘數字都出現了三次,請找出這個只出現一次的數字。
思路是,出現三次的數字,則該數字二進位制表示中,某一位1則出現了三次,所以統計二進位制表示中每一位的和,如果是3的倍數,則說明只出現一次的數字該位是0,否則該位是1;
題型六 不用加減乘除做加法
題型七 不用新的變數,交換兩個變數的值
基於異或運算
a=a^b;
b=a^b;
a=a^b;
基於加減法:
a=a+b;
b=a-b;
a=a-b;
位運算題目
今天看到牛客網的一些題目,非常經典。解法基本也都很熟悉,所以特地做個總結,後續慢慢補充。先上題目 數字中的二進位制有多少個1 這裡的數字並不關心它的符號,所以即便是負數,只需要得到二進位制中1的個數就可以了。但是在python中,對於負數的右移運算,符號位會保留,這樣在執行迴圈語句的右移操作時,首位...
位運算的題目
nowcoder 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次,找出這兩個數。兩個不相等的元素在位級表示上必定會有一位存在不同,將陣列的所有元素異或得到的結果為不存在重複的兩個元素異或的結果。diff diff 得到出 diff 最右側不為 0 的位,也就是不存在重複的兩個元素在位級表示上...
位運算相關總結
計算機cpu中alu是由邏輯門構成的,非常善於位運算。因此,在程式中使用位運算,經常能夠加快程式執行。另外,掌握一些位運算的相關知識也能增加一些程式設計的樂趣。位運算經常使用到異或運算和與運算。異或運算符合交換律 結合律,它的特點是相同為0,不同為1。與運算是同為1則為1。詳細內容 1 兩個數比較大...