位運算

計算機中的數在內存中都是以二進制新式進行存儲的,用位運算就是直接對整數在內存中的二進制位進行操做,所以其執行效率很是高,在程序中儘可能使用位運算進行操做,這會大大提升程序的性能。javascript

位操做符

  • &(與運算) 倆個位數都是1時,結果才爲1,不然爲0java

    1 & 1 // => 1
    1 & 0 // => 0
    0 & 1 // => 0
    0 & 0 // => 0
    1 0 0 1 1 & 1 1 0 0 1 // => 10001
  • |(或運算) 倆個位數都是0時,結果才爲0,不然爲1性能

    1 | 1 // => 1
    1 | 0 // => 1
    0 | 1 // => 1
    0 | 0 // => 0
    1 0 0 1 1 | 1 1 0 0 1 // => 11011
  • ^(異或運算) 倆個位相同則爲0,不一樣則爲1優化

    1 ^ 1 // => 0
    1 ^ 0 // => 1
    0 ^ 1 // => 1
    0 ^ 0 // => 0
    1 0 0 1 1 ^ 1 1 0 0 1 // => 01010
  • << 左移運算,向左進行移位操做,高位丟棄,低位補 0~~~~code

    let n = 1
    n << 3 // => 8
    // 移位前:0000 0000 0000 0000 0000 0000 0000 0001
    // 移位後:0000 0000 0000 0000 0000 0000 0000 1000
  • 右移運算,向右進行移位操做,對於無符號,高位補0、對於有符號位,高位補符號位
    let n = 8
    n >> 2 // => 2
    // 移位前:0000 0000 0000 0000 0000 0000 0000 1000
    // 移位後:0000 0000 0000 0000 0000 0000 0000 0010
     
    let n = -8
    n >> 2 // -2
    // 移位前:1111 1111 1111 1111 1111 1111 1111 1000
    // 移位後:1111 1111 1111 1111 1111 1111 1111 1110

常見位運算問題

  1. 位操做實現乘法除法ip

    • 數 n 向右移一位,至關於將 n 除以 2;
    • 數 n 向左移一位,至關於將 n 乘以 2;
    let n = 4;
    n >> 1 // => 2
    n << 1 // => 8
  2. 位操做交換倆數內存

    // 普通
    function swap (a,b){
        a = a + b; // 1 + 2
        b = a - b; // 3 - 2
        a = a - b; // 3 - 1
    }
    
    // 位操做
    function swap (a,b){
        a ^= b; // a = (a^b)
        b ^= a; // b = (b^b)^a = a
        a ^= b; // a = (a^b)^a = (a^a)^b = b
    }
  3. 位操做判斷奇偶數io

    • 只要根據數的最後一位是 0 仍是 1 來決定便可,爲 0 就是偶數,爲 1 就是奇數
    if(0 == (n&1)) // 偶數
  4. 位操做交換符號function

    • 交換符號將正數變成負數,負數變成正數
    let n = -8
    ~n + 1 // => 8
    
    let n = 8
    ~n + 1 // => -8
  5. 位操做求絕對值class

    • 整數的絕對值是其自己,負數的絕對值正好能夠對其進行取反加 1 求得,即咱們首先判斷其符號位(整數右移31位得0,負數右移31位獲得-1,即0xffffffff),而後根據符號進行相應得操做
    function abs(a){
        let i = a>>31;
        return i == 0? a: (~a+1)
    }
    • 上面的操做能夠進行優化,能夠將 i == 0的條件判斷語句去掉。咱們都知道符號位 i 只有倆種狀況,即 i=0爲正,i=-1爲負。對於任何數與0異或都會保持不變,與-1即0xffffffff進行異或就至關於對此數進行取反,所以能夠將上面三目運算符轉換爲((a^i)-i),即整數時 a 與 0 異或獲得自己,在減去0,負數時與 0xffffffff異或將a進行取反,而後在加上1,即減去i(i=-1)
    function abs(a){
        let i = a>>31;
        return ((a^i)-i)
    }
相關文章
相關標籤/搜索