JAVA中常用的二進制位操作


一,計算某個正數的二進制表示法中 1 的個數

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)。

參考:算法-求二進制數中1的個數

 
二,獲取某個數的第 i 位(判斷某個數的第 i 位是0 還是 1?)
 思路:如果第 i 位 與 1 相與 結果為1 表明第 i 位為1;如果為0 表明第 i 位為0
    //獲取 整數 num 的第 i 位的值
    private static boolean getBit(int num, int i)
    {
        return ((num & (1 << i)) != 0);//true 表示第i位為1,否則為0
    }

1 左移 i 位后,得到一個數,這個數只有第 i 位為1,其它位都為0

num 與這個數相與,得到的結果 要么是0,要么非0。結果為 非0 表示第 i 位為1,結果為0 表示第 i 位為0

 

 三,將第 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 位,然后再進行 與操作 或者  或操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM