1. 程式人生 > 其它 >位運算子n&(n-1)詳解與妙用

位運算子n&(n-1)詳解與妙用

用處一:求一個int型別數是否為2的冪

1、當n=4時,二進位制為:0100

n-1=3,二進位制為:0011

則:n&(n-1)==0 解釋(將0100最右邊的1變為0 則 0000=0)

2、當n=8時,為1000

  n-1=7,為0111

  則n&(n-1)==0

3、當n=5,為0101

  n-1為0100

  則n&(n-1)=0100=4!=0解釋(將0101最右邊的1變為0 則 0100=4)

從上面我們可以看出,凡是2的冪,均是二進位制數的某一高位為1,且僅此高位為1,比如4,0100;8,1000。那麼它的n-1就變成了1所處的高位變成0,剩餘低位變成1,如4-1,0011,8-1,0111,那麼n&(n-1)必為0

也就是n&(n-1)==0

用處二:一個數的二進位制中有多少位為1

    function findNumberOf1(num) {
        var count = 0;
        var n = num;
        while(n!==0) {
            count++;
            n = (n-1)&n
            console.log('count',count)
            console.log('n',n)
        }
        console.log(count)
    }

    findNumberOf1(
7)// 3

用處三:一個數是否為4的冪

一個數是4的冪,那麼必然是2的冪,反之,則不然

那麼首先確定條件n&(n-1)==0,確定出該數是否為2的冪,這就找到了一項必要條件

剛才說了一個數是2的冪卻不一定是4的冪,比如2,8,32等這些都是2的級數次方

但是,我們可以發現,2的偶數次方,比如2^0=1,2^2=4,2^4=16,這些數減去1,都能被3整除,而2的奇數次方的數減去1之後無法被3整除,不信可以試試

這樣的話,我們就可以很容易找到4的冪的充要條件,即 n>0 && ((n&(n-1))==0) && ((n-1)%3==0)

用處四:接下來還有一些可以用到符號&運算的例子,比如求一個數32位二進位制的倒序

int result =0forint i=0;i<32;i++){

       result<<=1;//result先左移一位,低位補0

       result = result+(n&1);

     n>>=1;//n右移一位,高位補0

}

用處五:將一個數表示為16進位制,並返回相應字串

if(n==0) return "0";

String result ="";

String[] map={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};

while(n!=0){

result = map[n&15]+result;

n>>=4;

}

長風破浪會有時,直掛雲帆濟滄海