通解通法 - 每次消去最右邊的1
把一個整數減去1,再和原來的整數作與運算,會把該整數最右邊一個1變成0。spa
那麼一個整數的二進制表示中有多少個1,就能夠進行多少次這樣的操做。code
eg:blog
原整數爲 1110...class
1110 & (1110 - 1) = 1110 & 1101 = 1100效率
1100 & (1100 - 1) = 1100 & 1011 = 1000二進制
1000 & (1000 - 1) = 1000 & 0111 = 0000di
> 判斷一個是是否是2的整數次方
若是是,那麼2進制中有且只有一位是1 !!! while
> 計算要改變多少位,M才能變成N
先計算M和N的異或,得出有多少位不一樣,也就是多少位1co
而後再計算1的個數數字
> 判斷奇偶數 / 判斷最右一位是不是1
讓該數字直接與1作與運算。若是結果是1,那麼該數字最右一位必定是1.
eg:
1101 & 0001 = 0001
1100 & 0001 = 0000
> 依次判斷每一位是否爲1
n爲要輸入的數字,flag從1開始,依次左移一位去挨個判斷n的每一位
1 while(flag){ 2 if(n & flag){ 3 //do someting... 4 } 5 flag = flag << 1; 6 }
> 快速乘以2,除以2
左移運算符,<<,等同於乘以2
右移運算符,>>,等同於除以2
位運算比乘除法效率高得多!!!