Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【剑指Offer】:二进制中1的个数 #31

Open
littlejoyo opened this issue Apr 3, 2020 · 0 comments
Open

【剑指Offer】:二进制中1的个数 #31

littlejoyo opened this issue Apr 3, 2020 · 0 comments
Assignees
Labels
算法 算法题目解题归档

Comments

@littlejoyo
Copy link
Owner

littlejoyo commented Apr 3, 2020

个人博客:https://littlejoyo.github.io/

微信公众号:Joyo说

  • 《剑指offer》算法题目11

  • 关键词:进制转化、补码反码原码

Github issues:https://github.com/littlejoyo/Blog/issues/

1.题目

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

例如:

  • 10的二级制为是1010,1的个数是2

  • -10使用补码表示则为0110,1的个数是2

2.解题思路

2.1 分析

  • 如果一个整数不为0,那么这个整数至少有一位是1。

  • 如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。

举个例子:

  • 一个二进制数1100,从右边数起第三位是处于最右边的一个1。

  • 减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011

  • 我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。

  • 如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0

  • 那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

2.2 代码实现

public class Solution {
    public int NumberOf1(int n) {
        int count = 0;
        
        while(n!=0){
            count++;
            n = n&(n-1);
        }
        return count;
    }
}

微信公众号

扫一扫关注Joyo说公众号,共同学习和研究开发技术。

weixin-a

@littlejoyo littlejoyo added the 算法 算法题目解题归档 label Apr 3, 2020
@littlejoyo littlejoyo self-assigned this Apr 3, 2020
@littlejoyo littlejoyo changed the title Coding:二进制中1的个数 【剑指Offer】:二进制中1的个数 Jun 13, 2020
@littlejoyo littlejoyo changed the title 【剑指Offer】:二进制中1的个数 【剑指Offer】二进制中1的个数 Jun 13, 2020
@littlejoyo littlejoyo changed the title 【剑指Offer】二进制中1的个数 【剑指Offer】:二进制中1的个数 Jun 13, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
算法 算法题目解题归档
Projects
None yet
Development

No branches or pull requests

1 participant