位運算在常見場景下的運用

2021-10-10 04:16:47 字數 1732 閱讀 3280

首先需要回顧一下常用的位運算操作

^異或運算: 兩個位相同為0,相異為1。

&與運算:兩個位都為1時,結果才為1。

|或運算:兩個位都為0時,結果才為0。

<<左移:各二進位全部左移若干位,高位丟棄,低位補0。

>>:各二進位全部右移若干位,對無符號數,高位補0,有符號數,各編譯器處理方法不一樣,有的補符號位(算術右移),有的補0(邏輯右移)

leetcode 461.漢明距離

兩個整數之間的[漢明距離](漢明距離)指的是這兩個數字對應二進位制位不同的位置的數目。

給出兩個整數 `x` 和 `y`,計算它們之間的漢明距離。

答案:

int numberofone(int n) 

return count;

} public int hammingdistance(int x, int y)

因為異或操作是將不同的位,計算結果得到 1,所以就把計算 x 與 y 二進位制位的不同位置的數目這個問題,轉換成了計算x ^ y的結果二進位制表示中 1 的個數。通過n = n & (n - 1)這種方式,每次可以消掉最低位的 1,迴圈直到 n 等於 0,可以得到x ^ y結果的二進位制表示中 1 的個數,也是題目的答案。

leetcode 136. 只出現一次的數字

給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
// time: o(n), space: o(1)

public int singlenumberwithxor(int nums)

// time: o(n), space: o(n)

public int singlenumberwithset(int nums)

sum += num;

}return 2 * uniquesum - sum;

}

題目只有乙個出現一次的數字,其餘均出現兩次。兩個相同的數字 ^ 運算結果為 0,而 0 與任何數字異或,均為其本身,所以只需要將陣列中所有數字異或起來就可找到只出現一次的數字。

leetcode 371. 兩整數之和

不使用運算子 + 和 - ,計算兩整數 a 、b之和。
public int getsumrecursive(int a, int b) 

// time: o(m), space: o(1)

public int getsumiterative(int a, int b)

return a;

}

a ^ ba + b不帶進製的和,(a & b) << 1a + b的進製,所以求 a 與 b 的和,可以轉換成求a ^ b(a & b) << 1的和。又因為(a & b) << 1每次左移,右側低位都為被 0 填充,當(a & b) << 1為 0 時,則當前是兩者的和即為a ^ b

位運算在 PHP 實際專案當中的運用

來回顧一下這些基礎知識,同時也會講位運算在 php 實際專案當中的高階技巧。一 位運算知識回顧 php 手冊當中,專門對位運算及位運算子進行了使用介紹。按位與運算子 之所以稱為位運算,指的是在運算過程中,我們會把兩組需要位運算的數值進行二進位製化,然後兩組二進位制的數字從低位向左對齊。這裡的位指的是...

位運算在 PHP 實際專案當中的高階運用

我們首先來看乙個系統中常見的需求 有乙個廣告表,我們要對廣告做顯示控制 可能的表結構如下 create table finger ad ad id int 11 unsigned not null auto increment comment 主鍵 ad name varchar 50 not nu...

位運算在演算法中的應用

leetcode原題位址 題目描述 給定乙個整數,編寫乙個函式來判斷它是否是 2 的冪次方。解法 n n 將除最後一位的1之外的所有的數字置為0 因為 n n 1,所以n n n n 1 例如 7對應的二進位制為0111 7對應的二進位制為1001 7 7 0001 實現 public boolea...