1. 程式人生 > >劍指offer-11-二進制中1的個數

劍指offer-11-二進制中1的個數

操作 負數 其中 off offer HERE ber class return

題目描述

輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼表示。

題目分析

原碼、反碼、補碼的基本概念:①正整數:符號位為0,原碼=反碼=補碼;②負整數:符號位為1,反碼(符號位不變,其他位數值求反),補碼(符號位不變,反碼最低位+1)。具體講解參考此博文。

方法一:將數據分別與flag(即1,10,100,1000...)與操作,可以計算有多少個1,需要計算32次

方法二:將n與n-1與操作,假設8(1000)與7(111)=0,直接計算停止,一個1;若是7(111)與6(110)=(110)(count=1)還需繼續計算,6(110)與5(101)=4(100)(count=2)還需繼續計算,4(100)與3(11)=0(count=3)無需計算,有多少個1就計算多少次

代碼

方法一

function NumberOf1(n)
{
    // write code here
    var count = 0,flag=1;
    while(flag){
        if(n&flag)count++;
        flag=flag<<1;
    }
    return count;
}

方法二

function NumberOf1(n)
{
    // write code here
    var count = 0;
    while(n){
        n=n&(n-1);
        count++;
    }
    return count;
}

劍指offer-11-二進制中1的個數