HOME/剑指Offer/

1.题目

Article Outline
TOC
Collection Outline

1.题目

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

1.1题解

利用一个结论:一个二进制数n减1后与原二进制数进行&运算( 即n&(n-1) )会消去最右边的1。

  • 假设二进制数101进行减1运算,刚好最右边是1,则得到100,此时用100跟101做&运算,得到的是100,故消去了101左右边的1。
  • 100减1呢?最低位是0,跟十进制减法一样啊,向高位借。(可以脑补一下十进制100减1的过程)

所以二进制100减1的运算过程如下:

  • 最右边的0向右数第二位借1得:2-1=1,
  • 右数第二位还是0,却要借给最右边那位1,所以它也得向高位借。
  • 这样右数第三位的1借给它1之后变成0,右数第二位借1得:2-1=1。
  • 所以得到新数为011。

1.2 核心知识

  • &是二进制“与”运算,参加运算的两个数的二进制按位进行运算,运算的规律是:

  • 0 & 0=0
    0 & 1=0
    1 & 0=0
    1 & 1=1
  • | 运算

    0 | 0 = 0
    0 | 1 = 1
    1 | 0 = 1
    1 | 1 = 1
  • 异或(^)运算

    0 ^ 0 = 0
    0 | 1 = 1
    1 ^ 0 = 1
    1 ^ 1 = 0
  • 对于参加运算的数要换算为二进制进行运算,例如3 & 2的结果是2,过程如下:

    3 & 2
    =0111 & 0010
    =0010
    =2

1.3答案

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