题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2。
利用n&(n-1):把一个整数n减去1,再和原整数做与运算,会把整数最右边一个1变成0。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。
代码实现:
public int numberOfOne(int n){ int count=0; while(n!=0){ count++; n=n&(n-1); } return count; }
把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。很多二进制的问题都可以用这个思路解决。
1)判断一个整数是不是2的整数次方。
一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位都是0。根据前面的分析,把这个整数减去1之后再和它自己做与运算,这个整数中唯一的一就会变成0。
//判断n是否是2的整数次方 public boolean isPowerOfTwo(int n){ return (n>0&&(n&(n-1))==0)?true:false; }
2)判断一个整数是不是4的整数次方。
一个整数如果是4的整数次方,那么必然满足该整数是2的整数次方。另外,2的偶数次方减去1之后都能被3整除,而2的奇数次方却不能。
public boolean isPowerOfFour(int n){ return (n>1&&(n&(n-1)==0)&&((n-1)%3)==0)?true:false; }
3)输入两个整数m和n,计算需要改变m的二进制表示中的多少位才能得到n。
比如10的二进制表示为1010,13的二进制表示为1101,需要改变1010的3位才能得到1101。第一步求这两个数的异或,第二部统计异或结果中1的位数。
public int countOfDiff(int m,int n){ int x=m^n; int count=0; while(x!=0){ count++; x=x&(x-1); } return count; }
 
                    
                 
 posted on
 posted on 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号