剑指offer-二进制中1的个数

二进制中1的个数

解题思路

这里涉及到一些计算机基础知识,本科学过都忘了,在这里记录整理一下。
首先是最基础的原码反码补码,以下链接写的很清楚:原码,反码,补码详解

  • 计算机中存储的是补码
  • 每个整数都是4字节,32位
  • 正数的原码、反码、补码都一样

方法一:逐位判断

  • 根据与运算定义,设二进制数字n ,则有:
    若 n & 1 = 0 ,则 n 二进制最右一位为 0 ;
    若 n & 1 = 1 ,则 n 二进制最右一位为 1 。

  • 根据以上描述,有以下循环:
    当数n右移到一位不剩也就是等于0的时候,循环结束;
    n&1 == 1count++,n右移一位。

问题:数n是负数怎么办

  • 负数的补码最高位是1表示为符号位。
  • n>>1,有符号右移,左边以1补位,无限循环了;
  • n>>>1,无符号右移,左边以0补位,最后数n就变成0。
function NumberOf1(n){
    let count = 0
    let flag = 1
    while(n){
        count +=n&flag
        n = n >>>1
    }
    return count
}

方法二:n&(n-1)
这个方法比较巧妙了

  • n-1:二进制数字n最右边的1变成了0,这个1右边的0都变成了1
  • n&(n-1):二进制数字n最右边的1变成了0,其余位不变
  • 数n有多少个1,就能做多少这样的操作,知道数n变成0剑指offer-二进制中1的个数_第1张图片
function NumberOf1(n){
    let count = 0
    while(n){
        n&=n-1
        count++
    }
    return count
}

你可能感兴趣的:(剑指offer-二进制中1的个数)