JAVA中经常使用的二进制位操做

一,计算某个正数的二进制表示法中 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 位,而后再进行 与操做 或者  或操做。

相关文章
相关标签/搜索