位運算實用方法

一、一些應用技巧數組

(1) 判斷int型變量a是奇數仍是偶數           io

a&1   = 0 偶數function

       a&1 =   1 奇數變量

(2) 取int型變量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1原理

(3) 將int型變量a的第k位清0,即a=a&~(1<<k)技巧

(4) 將int型變量a的第k位置1, 即a=a|(1<<k)方法

二、交換變量co

常規的交換變量的方法須要一個臨時變量:tmp=null; tmp = a; a=b;b=tmp;數字

位運算: a^=b;b^=a;a^=b; 不須要額外的變量便可交換二者,原理是:位運算

由等式一、2可得:b = b^a^b;因爲任何值異或自己均爲0,任何值異或0爲其自己,故 b=a;

故等式3爲: a = a^b^a; 即a=b;

三、正數變爲負數、負數變爲正數(涉及到反碼、補碼、原碼的概念和轉換問題,請自行腦補)

    a = -1; 

    function convert(int a){return ~a+1; }

    convert(a);

四、取符號位(負數爲-1, 正數爲0)

    a>>31

五、乘以2(固然也能夠乘以四、8等)

    a<<1

六、除2

    a>>1

七、比較兩整數的大小(返回值 0:等於 1大於 -1小於)  第二行沒看懂原理

    function compareInt(a, b){

        if(a^b == 0){return 0;}

        if ( ( (a + (~(b & 0x7fffffff)) ^ a) & (((~a) | b)) ) >>31 ) {return -1};

        return 1;

    }

八、消支最後一位1(僅限最後一位爲1的數字,不然會出現不可控的數字)

    x&(x-1)

九、應用於數組中,有一個數只出現了一次,其它的數都出現2的位數次,找出出現一次的數

    a^b^c = a;

相關文章
相關標籤/搜索