位運算 - 位運算的常見用法/題目

通解通法 - 每次消去最右邊的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

位運算比乘除法效率高得多!!!

相關文章
相關標籤/搜索