AcWing25:二进制数中1的个数
Posted 劭兮劭兮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing25:二进制数中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) |
---|---|---|
6 | 110 | 21 = 2 |
7 | 111 | 20 = 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的个数的主要内容,如果未能解决你的问题,请参考以下文章