神級運算——位運算

位運算概述

從現代計算機中所有的數據都以二進制的形式存儲在設備中。即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:覺得博主寫的還不錯的點點贊,關注一波,謝謝大家的支持了,嘿嘿~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章