AcWing25:二进制数中1的个数

Posted 劭兮劭兮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing25:二进制数中1的个数相关的知识,希望对你有一定的参考价值。

最近,尝试做一些很简单很简单的算法题,有点头秃(本小白比较菜,让大家见笑了,哈哈哈),但是看到老婆的照片,瞬间好开心!
在这里插入图片描述

原题

二进制中1的个数
在这里插入图片描述

解决办法一

作为JAVA专业的学生,第一次,我借助了JAVA中已经实现好的方法来解决本问题,偷个懒:
类Integer中,已经定义好了可以求二进制数中1的个数的方法,那就偷个懒用一下:
在这里插入图片描述

public class Ninth {

	public static void main(String[] args) {
		int result = NumberOf1(-2);
		System.out.println(result);

	}
	
	 public static int NumberOf1(int n)
	 {
//		 注意:Integer是一个类,而int只是java中的基本数据类型;
//		 Integer integer = n;
//		 int result = integer.bitCount(n);
//		 return result;
		 
		 return Integer.bitCount(n);
	 }
}

在这里插入图片描述

小笔记:int 类型数据转化为Integer

在这里插入图片描述
在这里插入图片描述

解决办法二

首先来简单介绍一下lowbit(),lowbit(x)的值是x的二进制表达式中最低位的1所对应的十进制值。通俗点来说,lowbit(x)是将 x 转化成二进制数之后,只保留最低位(从右往左数,第一位)的1及其后面的0,截断前面的内容,然后再转成10进制数。

举个列子,lowbit(6) = 2,lowbit(7) = 1
原数二进制lowbit(x)
611021 = 2
711120 = 1

关于lowbit函数的实现方式,本小白已经在另外一篇博客中做了详细介绍,感兴趣的小伙伴们可以参考一下啊!
浅谈lowbit运算

言归正传,我们接着来解决问题:
lowbit函数有两种实现方式:

x&-x
或者
x&(x^(x-1))

(原理在另外一篇博客中已经讲了,小伙伴们可以参考:浅谈lowbit运算

public class NinthOne {

	public static void main(String[] args) {
		int result = NumberOf1(-2);
		System.out.println(result);
	}
	
	 public static int NumberOf1(int n)
	 {
		 int result = 0;
		 while(n!=0) {
//			 两种方法求lowbit的值都可以:n&-n 或者  n&(n^(n-1))
//			 n = n - (n & -n);
			 n = n- (n & (n ^ (n - 1)));
			 result++;
		 }
		 
		 return result;
	 }

}

在这里插入图片描述
在这里插入图片描述
解题思路

lowbit(n) 运算可以求出 二进制数中 从右往左数 第一位 1 的位置,我们用原数 减去 lowbit 运算 所得到的数据,依次循环,直到0,跳出循环。

小白一个,欢迎小伙伴们一起探讨问题!

小记:原题链接:二进制中1的个数

以上是关于AcWing25:二进制数中1的个数的主要内容,如果未能解决你的问题,请参考以下文章

统计二进制数中的1的个数(0277)

AcWing 801. 二进制中1的个数

算法-求二进制数中1的个数

求二进制数中1的个数——引发的问题

位运算求二进制数中1的个数

求二进制数中1的个数