二进制中1的个数
时间限制:1秒 空间限制:32768K 热度指数:233498
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
有三种方法:
- 1.利用java内置函数将整数转换成二进制字符串,再计算字符串中1的个数
- 2.利用位运算特点n&(n-1)会将二进制最右的1消掉的原理,能做多少次这样的与运算就有几个1,直到0为止
- 3.无符号数右移,将该整数的每一位做右移后都作为新的一个数的最后一位再与1做与运算,是1则为1,0则为0
package test;
//输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
public class offer_5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(NumberOf1(5));//2
System.out.println(NumberOf2(5));//2
System.out.println(NumberOf3(5));//2
}
//java内置函数将整数转换成二进制字符串,逐个字符比较,例如5
public static int NumberOf1(int n) {
int count=0;
String s=Integer.toBinaryString(n);//s="101"
for(int i=0;i<s.length();i++)
{
if(s.charAt(i)=='1')
{
count++;//i=0 和i=2时指定位置上字符为‘1’,count分别加一次
}
}
return count;
}
//利用位运算的特点,n与n-1做与运算会将二进制最右边的1去掉,所以能做一次与运算代表去除一个1,
// 直到为零为止,例如5
public static int NumberOf2(int n) {
int count=0;
while(n!=0)
{
count++;
n=n&(n-1);
// n=5时 101&100=100 count加一次,下一个循环n=100 则100&011=0 count加一次
// 下一次n=0不满足循环条件跳出循环没有再次做与运算,count也无法再加
}
return count;
}
//无符号右移,依次将整数的二进制向右移一位,则从右开始向左,每一位都作为新数的最后一位,
// 与1做与运算时相当于检查该数最后一位是否为1,为1则count加1,例如5
public static int NumberOf3(int n) {
int count=0;
for(int i=0;i<32;i++)
{
if((n>>>i&1)==1)//将n看成二进制形式,如5,“....0000 0101” i=0时,..0101&1=1,count加一
// i=1时,..010&1=0,不加,i=2时,..01&1=1,count加一,i=3及更大的数时,都是..0000&1=0,不加
{
count++;
//如5,“101”有两个1则会有2个数末尾为1,这两个数与1做与运算时等于一于是count计数加一
}
}
return count;
}
}