1. 程式人生 > >Java位運算總結(LeetCode裡常用)

Java位運算總結(LeetCode裡常用)

Java位運算是針對於整型資料型別的二進位制進行的移位操作。主要包括位與、位或、位非,有符號左移、有符號右移,無符號右移等等

在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路。

    1.求負整數的補碼,將其對應正數二進位制表示所有位取反(包括符號位,0變1,1變0)後加1

數0的補碼錶示是唯一的

    2.轉化為原碼
已知一個數的補碼,求原碼的操作其實就是對該補碼再求補碼:
⑴如果補碼的符號位為“0”,表示是一個正數,其原碼就是補碼。
⑵如果補碼的符號位為“1”,表示是一個負數,那麼求給定的這個補碼的補碼就是要求的原碼。

【例】已知一個補碼為11111001,則原碼是10000111(-7)。
因為符號位為“1”,表示是一個負數,所以該位不變,仍為“1”。
其餘七位1111001取反後為0000110;
再加1,所以是10000111。

PS:沒有無符號左移;
計算機表示數字正負不是用+ -加減號來表示,而是用最高位數字來表示,0表示正,1表示負

  1. Java基本資料型別所佔位元組數

            資料型別       位元組數     預設值
            byte          8bit              
            boolean       8bit     false
            char          8bit        
            short         16bit      0
            int           32bit      0
            long          64bit      0L
            float         32bit      0.0f
            double        64bit      0.0d
    
  2. 位運算

        位與&  (真真為真,真假為假,假假為假)
        位或 |   (真真為真,真假為真,假假為假)
        位非 ~  (取反碼)
        位異或 ^ (真真為假,真假為真,假假為假)  相同則為假
        有符號左移:按二進位制形式把所有的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。
    
        有符號右移>>(若正數,高位補0,負數,高位補1)
        -4>>2
            1111 1111 1111 1111 1111 1111 1111 1100   補碼
            1111 1111 1111 1111 1111 1111 1111 1111   右移,最左邊空出兩位按規則負數空位補1
            1000 0000 0000 0000 0000 0000 0000 0000   解碼
            1000 0000 0000 0000 0000 0000 0000 0001   補碼(補碼即最後一位+1)
            結果:-1
                    無符號右移:高位的空位補零
    
  3. 位運算的應用

    1).  判斷int型變數a是奇數還是偶數    
             a&1  = 0 偶數 
             a&1 = 1 奇數
    2).  求平均值,比如有兩個int型別變數x、y,首先要求x+y的和,再除以2,但是有可能x+y的結果會超過int的最大表示範圍,所以位運算就派上用場啦。
            (x&y)+((x^y)>>1); 
    3.  對於一個大於0的整數,判斷它是不是2的幾次方
            ((x&(x-1))==0)&&(x!=0); 
    4.  比如有兩個int型別變數x、y,要求兩者數字交換,位運算的實現方法:效能絕對高效
            x ^= y; 
            y ^= x; 
            x ^= y; 
    5. 求絕對值
            int abs( int x ) 
           { 
             int y ; 
             y = x >> 31 ; 
            return (x^y)-y ;        //or: (x+y)^y 
           }
    6.  取模運算,採用位運算實現:
             a % (2^n) 等價於 a & (2^n - 1) 
    7.  乘法運算   採用位運算實現
             a * (2^n) 等價於 a << n
    8.   除法運算轉化成位運算
              a / (2^n) 等價於 a>> n 
    9.   求相反數
             (~x+1) 
    10  a % 2 等價於 a & 1