位運算概述
從現代計算機中所有的數據都以二進制的形式存儲在設備中。即0、1兩種狀態,計算機對二進制進行的運算(+、-、*、/)都叫位運算。示例:
int a = 35;
int b = 47;
int c = a + b;
計算a+b的值,在計算機中就是以二進制進行運算的。所以上面我們所給的int變量會在機器內部先轉換爲二進制在進行相加:
35: 0 0 1 0 0 0 1 1
47: 0 0 1 0 1 1 1 1
————————————————————
82: 0 1 0 1 0 0 1 0
所以,合理的運用位運算更能顯著提高代碼在機器上的運行效率。
位運算符
經典運用
不用加減乘除做加法
//step1:異或查看兩個數進行加法操作後的結果
//step2:與運算計算出想對應的位置的進位結果,然後左移一位
//b代表的是兩數相加是否有進位,有的話就繼續,沒有的話就結束得出相加後的答案
public class Solution{
public int Add(int a,int b){
while(b != 0){
int temp = a ^ b;//計算出相對應的位置相加後的結果
b = (a & b) << 1;//計算出想對應的位置的進位,然後左移一位
a = temp;
}
return a;
}
}
//這個其實可以簡寫成return (a^b)+((a&b)<<1);
二進制中1的個數
public class Solution{
public int NumberOf1(int a){
if(a == 0||a == 1){
return a;
}
int count = 0;
while(a != 0){
count++;
a = a & (a-1);
}
return count;
}
}
不使用第三個變量的情況下交換兩個變量的值
//原理:運用異或的特性
//A ^ B = C --> C ^ A = B --> C ^ B = A
public void exchange(int a,int y){
x = x ^ y;
y = x ^ y;
x = x ^ y;
}
其他運用
- 判斷一個數的奇偶性
public void Test(int a){
if((a & 1)==0){
System.out.println("a是偶數");
}else{
System.out.println("a是奇數");
}
}
- 兩數的中位數
public void Test(int a,int b){
//通過位運算不會造成溢出
int mid = a + (a - b) >> 1;
}
- 兩數的平均數
public int average(int a,int b){
return (a & b)+((a ^ b) >> 1);
}
以上就是我今天分享的常見位運算的經典問題,其實位運算的應用遠遠不止這些,在算法方面適當的使用還是很有幫助的。
PS:覺得博主寫的還不錯的點點贊,關注一波,謝謝大家的支持了,嘿嘿~~~