位運算基礎及其常見應用

最近在看jdk源碼,發現不少時候用到位運算,因爲本人不是本專業的,不少位運算的內容不理解。因而上網整理位運算的一些基礎知識與經常使用應用,以供複習、查詢。  python

## 位運算基礎  bash

System.out.println(3 & 6);   //2->10, 位與,有0爲0,反之爲1
        System.out.println(3 | 6);      //7->111,位或,有1爲1,反之爲0
        System.out.println(3 ^ 6);   //5->101,位異或,同0或同1爲0,反之爲1
        System.out.println(~3);       //-4-> 11111111111111111111111111111100,取反
        System.out.println(3 >> 1);       // 1 ,右移,代替除2
        System.out.println(3 << 1);       // 6,左移,代替乘2
        //負數無符號右移與右移區別,無符號右移不區分正負,右移在正數的右移基礎上加個負號
        System.out.println(-6 >>> 1);       //2147483645, 無符號右移
        System.out.println(-6 >> 1);       // -3
複製代碼

## 位運算進階ui

  • 判斷某位上是否爲1或設置爲1的寫法,拓展應用就是枚舉子類,見
System.out.println(6 >> 2 & 1);       // 1,判斷從右向左第3位上是否爲1
        //偶數最低位二進制爲0,所以能夠利用這點判斷奇偶
        System.out.println(3 & 1);       // 1,3爲奇數
        System.out.println(6 & 1);       // 0,6爲偶數
        System.out.println(6 | 1 << 3);       // 14,把6從右向左第4位設置爲1
複製代碼
//枚舉集合["A","B","C","D"]的子集,由乘法原理能夠輕易得出共2的4次方16個子集
        List<String> list = Lists.newArrayList("A","B","C","D");
        //0-15分別對應16個子集,把0-15轉爲二進制數,位數上爲1的字母放入結果便可
        for (int i = 0; i < 2 << 4; i++) {
            List<String> tempList = new ArrayList<>();
            for(int j=0; j<4;j++){
                if(((i>>j)&1)==1){
                    tempList.add(list.get(j));
                }
            }
            System.out.print(tempList.toString()+" ");
複製代碼

順便說一下,樓主業餘學了下python,這題還有一種很python的解法,代碼以下:spa

import itertools
for i in range(5):
    print([x for x in itertools.combinations(["A","B","C","D"],i)])
複製代碼
  • a=a^b^b的兩種運用(b^b=0)
//在成雙成對的數找惟一的值(簡稱找單身狗)
        List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 2, 3, 1);  
        Integer res = 0;
        for (Integer x : list) {
            res ^= x;
        }
        System.out.println(res); //4  除了4是單身狗,其餘都是成雙成對的
複製代碼
//交換a,b的值
        int a = 2, b = 3;
        a=a^b;
        b=a^b;
        a=b^a;
        System.out.printf("a=%d,b=%d%n", a, b);
複製代碼
  • a^(a-1)去除a二進制數最後一個1
System.out.println(7 & 6);  //111->110即 5
        System.out.println(6 & 5); //110->100即 4
        //2的n次方只有一個1,可用此判斷是否爲2的冪,以下
        System.out.println(8 & 7); //1000->0000即 0
複製代碼

以上是位運算在實際中常見的應用,固然還有其餘不少技巧未被挖崛,這裏就不收錄了。code

相關文章
相關標籤/搜索