位與(&)經常使用編程技巧

補充知識:1)正整數的補碼與原碼相同;算法

               2)求負整數的補碼:原碼 符號位不變,數值位各位取反,最後整個數加1獲得補碼;編程

               3)按位與&的結果是補碼與補碼運算獲得的結果。spa

 進制轉換:1)十進制整數----->二進制(除2取餘倒排)code

               2)二進制--->十進制(按權重相乘相加)blog

               3)十六進制 <------>二進制(1位對應4位)class

1. int x; x按位表示有多少位1?技巧

編程中常會用到位編程,若要數出一個數x中有多少位1,可用以下算法:二進制

int func(int x){
    int count = 0;
    while(x){
        count++;
        x   =  x&(x-1);
    }  
    return count;
}

x & (x-1)獲得的是消去x最低位的1後的數。di

2.  int x; x中最右邊的位1的表示數是多少?while

x & (-x);//獲得x最右邊位1的表示數

x & (-x)獲得的是x最低位是1的表示數。

(N-Queens就用到這種技巧)

相關文章
相關標籤/搜索