補充知識: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就用到這種技巧)