以下內容就不講位運算的基礎了,需要複習位運算的同學,可以參考我的以下文章
位運算基礎
位運算例子
為什麼要介紹位運算呢?位運算更符合計算機的執行方式,即使是用c,c++,j**a,python,vb,等程式語言,到最後都會被變成二進位制檔案,讓運算器進行位運算。因此,我們幫計算機做好了識別符號的轉換,這樣就讓程式跑的快一點。
技巧一:
用o(1)時間檢查整數n是否是2的冪次
首先思路分析:
n如果是2的冪次,則n滿足兩個條件。
1.n >0
2.n的二進位制表示中只有乙個1 1111對應8421慢慢體會
因為n的二進位制表示中只有乙個1,所以使用n & (n - 1)將n唯一的乙個1消去,應該返回0。
技巧二
消去二進位制中的最後一位1
x &
(x -
1) 用於消去x最後一位的1
x =1100
x -1
=1011
x &(x -1)
=1000
技巧三
計算在乙個 二進位制數中有多少個 1。
利用乙個變數count
由x & (x - 1)消去x最後一位的1可知。不斷使用 x & (x - 1) 消去x最後一位的1,計算總共消去了多少次即可。count++即可
技巧四
二進位制或者別的進製,別的進製需要先轉進製
後續我會放出進製轉換函式,呼叫即可,先留個位置
如果要將整數a轉換為b,需要改變多少個bit位?
思路將整數a轉換為b,如果a和b在第i(0<=i<32)個位上相等,則不需要改變這個bit位,如果在第i位上不相等,則需要改變這個bit位。所以問題轉化為了a和b有多少個bit位不相同。聯想到位運算有乙個異或操作,相同為0,相異為1,所以問題轉變成了計算a異或b之後這個數中1的個數。
技巧五
給出 2 * n + 1個數字,除其中乙個數字之外其他每個數字均出現兩次,找到這個數字
a ^ b ^ b = a
思路
因為只有乙個數恰好出現乙個,剩下的都出現過兩次,所以只要將所有的數異或起來,就可以得到唯一的那個數。
位運算奇技淫巧
位操作符 與運算 兩個位都是 1 時,結果才為 1,否則為 0,如 1 0 0 1 1 1 1 0 0 1 1 0 0 0 1 或運算 兩個位都是 0 時,結果才為 0,否則為 1,如 1 0 0 1 1 1 1 0 0 1 1 1 0 1 1 異或運算,兩個位相同則為 0,不同則為 1,如 1 0...
位運算的奇技淫巧
首先,先來介紹一下關於位運算中的 異或 若參加運算的兩個二進位制位值相同則為0,否則為1 下面是異或運算的三個性質 交換律 a b c a c b 任何數與0異或 0 n n 相同的數異或為0 n n 0 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次...
位運算有什麼奇技淫巧?
計算機中的數在記憶體中都是以二進位制形式進行儲存的,用位運算就是直接對整數在記憶體中的二進位制位進行操作,因此其執行效率非常高,在程式中盡量使用位運算進行操作,這會大大提高程式的效能。int a 8 a 3 移位前 0000 0000 0000 0000 0000 0000 0000 1000 移位...