位運算及其妙用


程序中的所有數在計算機內存中都是以二進制的形式儲存的,即只有0和1兩種數值,位運算就是直接對整數在內存中的二進制位進行。

1 <<(向左位移)

運算規則:a<<b,表示a轉為二進制后左移b位,左移后,空位補0。

例:

3:      00000000 00000000 00000000 00000011
  	   // 左移2位,空位補2個0
3<<2: 00000000 00000000 00000000 00001100

所以,3<<2 = 12

規律:a左移b位,就是a乘以2的b次方。

2 >>(向右位移)

運算規則:a>>b,表示a轉為二進制后右移b位,右移后,最高位是0,則空缺位補0;最高位是1,則空缺位補1。

例:

4:	    00000000 00000000 00000000 00000100
		 // 右移1位。右移后,最高位是0,則空缺位補0;最高位是1,則空缺位補1
4>>1:   00000000 00000000 00000000 00000010

所以,4 >> 1 = 2

規律:a右移b位,就是a除以2的b次方。

3 &(與運算)

運算規則:相同位的兩個數字都為1,則為1;若有一個不為1,則為0。

例:

5:    00000000 00000000 00000000 00000101
6:    00000000 00000000 00000000 00000110
5&6:  00000000 00000000 00000000 00000100    

所以,5&6 = 4

4 |(或運算)

運算規則:相同位只要有一個為1即為1。

例:

5:    00000000 00000000 00000000 00000101
6:    00000000 00000000 00000000 00000110
5|6:  00000000 00000000 00000000 00000111  

所以,5|6 = 7

5 ^(異或運算)

運算規則:針對二進制位,如果某位不同則該位為1, 否則該位為0。

例:

5:    00000000 00000000 00000000 00000101
6:    00000000 00000000 00000000 00000110
5^6:  00000000 00000000 00000000 00000011 

所以,5^6 = 3

6 ~(取反運算)

運算規則:對二進制各位數進行取反,即1變成0,0變成1。

例:

5:    00000000 00000000 00000000 00000101
~5:   11111111 11111111 11111111 11111010 // 補碼形式
       11111111 11111111 11111111 11111001 // 反碼
       10000000 00000000 00000000 00000110 // 原碼

所以,~5 = -6

位運算的一些妙用

  • 在不使用第三個變量的情況下,如何交換兩個變量的值?

常規操作:

    void swap(int a, int b) {
        int temp = a;
        a = b;
        b = temp;
    }

騷操作:

    void swap(int a, int b) {
        a^=b;
        b^=a;
        a^=b;
    }
  • 判斷奇偶

常規操作:

    if (a%2 == 0) {
        System.out.println("偶數");
    } else {
        System.out.println("奇數");
    }

騷操作:

    if ((a&1) == 0) {
        System.out.println("偶數");
    } else {
        System.out.println("奇數");
    }
  • 求平均數

常規操作:

    int average(int x, int y) {    
        return (x+y)/2; 
    } 

騷操作:

    int average(int x, int y) {    
        return (x&y)+((x^y)>>1); 
    } 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM