一,計算某個正數的二進制表示法中 1 的個數html
1 //求解正數的二進制表示法中的 1 的位數 2 private static int countBit(int num){ 3 int count = 0; 4 for(; num > 0; count++) 5 { 6 num &= (num - 1); 7 } 8 return count; 9 }
算法思路:每次for循環,都將num的二進制中最右邊的 1 清除。算法
爲何n &= (n – 1)能清除最右邊的1呢?由於從二進制的角度講,n至關於在n - 1的最低位加上1。舉個例子,8(1000)= 7(0111)+ 1(0001),因此8 & 7 = (1000)&(0111)= 0(0000),清除了8最右邊的1(其實就是最高位的1,由於8的二進制中只有一個1)。再好比7(0111)= 6(0110)+ 1(0001),因此7 & 6 = (0111)&(0110)= 6(0110),清除了7的二進制表示中最右邊的1(也就是最低位的1)。spa
參考:算法-求二進制數中1的個數htm
二,獲取某個數的第 i 位(判斷某個數的第 i 位是0 仍是 1?)blog
思路:若是第 i 位 與 1 相與 結果爲1 代表第 i 位爲1;若是爲0 代表第 i 位爲0get
//獲取 整數 num 的第 i 位的值 private static boolean getBit(int num, int i) { return ((num & (1 << i)) != 0);//true 表示第i位爲1,不然爲0 }
1 左移 i 位後,獲得一個數,這個數只有第 i 位爲1,其它位都爲0it
num 與這個數相與,獲得的結果 要麼是0,要麼非0。結果爲 非0 表示第 i 位爲1,結果爲0 表示第 i 位爲0for循環
三,將第 i 位設置爲1循環
思路:第 i 位與0 或,值不變。第 i 位與1 或,變成1。所以,咱們的目標是 num 與 一個第 i 位值爲1,其它位的值都爲0的數相 或二進制
//將 整數 num 的第 i 位的值 置爲 1 private static int getBit(int num, int i) { return (num | (1 << i)); }
四,將第 i 位設置爲0(清0)
思路:第 i 位和0與,第 i 位就變成了0。其它位 都與 1 與,其它位保持不變。這樣,就只把第 i 位清0了
//將 整數 num 的第 i 位的值 置爲 1 private static int getBit(int num, int i) { int mask = ~(1 << i);//000100 return (num & (mask));//111011 }
總之,獲取第 i 位的值,或者是將第 i 位置0或者置1 ,其整體思路就是:將 1 左移 i 位,而後再進行 與操做 或者 或操做。