整数二进制中1的个数

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

使用语言JAVA,整数类型 4字节 32位

右移法:负数比较32次 整数最大位所在位置次,最多31

	//实现思路:
	//右移法:将运算数每位都与1进行位与,如果结果为1,则表示该位为1
	//使用右移法
	   public int NumberOf1(int n) {
		   int numberOfOne=0;//记录1的数量
		   while(n!=0)//当当前数不等于0时 (原数进行无符号右移,高位补零,当原数为零时,判断结束)
		   {
			   //&位与运算:将两侧数字转换成二进制进行与运算,结果为运算结果
			   //&&逻辑与(短路与)运算  结果为boolean值
			  /* if((n&1)>0)
			   {
				   numberOfOne++;  
			   }此处代码块等价于下述*/
			   numberOfOne+=n&1;//和一相与结果只可能是0或者1 
			   
			   //>>>无符号右移(逻辑右移) 最高位补零  符号位也依次后移
			   //>>带符号右移 (算术右移) 最高位补符号位
			   n=n>>>1;//无符号右移一位
		   }
		   return numberOfOne;//返回统计中1的个数
	    }

左移法:比较整数位数次

  /************左移法:原数不变,将1左移 判断原数的每一位*/
	   public int NumberOf1Left(int n)
	   {
		   int withNum=1;//比较元素
		   int numberOfOne=0;//1的数量
		   
		   while(withNum!=0)//左移数不为零时,循环
		   {
			   if((n&withNum)!=0)//注意此时的判断条件 相与结果为2的withNum-1次方
			   {
				   numberOfOne++;   
			   }
			   withNum=withNum<<1;
		   }
		   return numberOfOne;
	   }

相与法:比较1的个数次

  /**********************相与法:将原数与原数减1相与**************/
	   public int NumberOf1With(int n)
	   {
		  /* 如果一个整数不为0,那么这个整数至少有一位是1。
		   如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。
		  两者相与,当前1前面的数相同,1及之后的数相反,仅保留1之前的数
		  例如10110 第一个1在从左边数的第二位;10110-1=10101;两者左边第二位之前的位相同,相与不变,左边第二位及之后的位相反,相与全为零
		  相与结果为10100,这样便找出来了一个1
		   其余所有位将不会受到影响。*/
		   int numberOfOne=0;
		   while(n!=0)//不为零 肯定有一位为1 
		   {
			   numberOfOne++;
			   n=n&(n-1);//从数中找出一个1(最左边开始)  去掉
		   }
		   return numberOfOne;
	   }

Integer类函数1

 /* 调用JAVA内置函数位计算函数*/
	   //函数原型:
	  /* public static int bitCount(int i)
	   Returns the number of one-bits in the two's complement binary representation of the specified int value.
	   This function is sometimes referred to as the population count.*/
	   public int NumberOf1Sys(int n)
	   {
		   return Integer.bitCount(n);
	   }

Integer类函数2

/*调用JAVA内置字符串处理函数*/
	   //函数原型public static String toBinaryString(int n)
	   //将整数的二进制表示形式转化为字符串
	   public int NumberOf1ToStr(int n)
	   {
		   return Integer.toBinaryString(n).replaceAll("0", "").length();//删除字符串中的0后统计长度返回
	   }

猜你喜欢

转载自blog.csdn.net/weixin_43823363/article/details/87859243