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

二進制中1的個數

題目描述:

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

問題分析:

將數字轉換成二進制數字,如果是直接求的話,注意數組反轉,反轉之後,若不夠32位進行補零

負數的補碼:
	求出絕對值的原碼,從最後一個數字開始往前數,到第一個1之後把前面的全部取反

代碼展示:

function NumberOf1(n)
{
    //還可以使用二進制轉換來減少代碼量 num.toString(2)
    var nums = [];
    var num = 0;
    var tmp = 0;
    if(n == 0)
        return 0;
    else if(n>=1){
        
        while(n>0){
            nums.push(n%2);
            n = parseInt(n/2);
        }
        nums.reverse();
        for(let i=0;i<nums.length;i++){
            if(nums[i] == 1)
                num++;
        }
        return num;
        
    }else{
        //求出絕對值的原碼,從最後一個數字開始往前數,到第一個1之後把前面的全部取反
        n = Math.abs(n);
		let tmp = 0;
        while(n>0){
            nums.push(n%2);
            n = parseInt(n/2);
        }
        //數組反轉
		nums.reverse();
        
		//共32位數字,若前面數字不夠,則補零

		let count = 32-nums.length;
		if(nums.length <32){
			for(let i=0;i<count;i++){
				nums.unshift(0);
			}			
		}
        for(let i=nums.length-1;i>0;i--){
            if(nums[i] == 1){
                tmp = i;
            }
        }
        
        //取相反數字
        for(let i=0;i<tmp;i++){
            if(nums[i] == 0)
                nums[i] = 1;
            else if(nums[i] == 1)
                nums[i] = 0;
        }
            
        for(let i=0;i<nums.length;i++){
            if(nums[i] == 1)
                num++;
        }
        return num;
    }
}

總結:

n.toString(2)進制轉換得到的數據是字符串,這個要注意一下
進制轉換函數:
	parseInt(str,radix); 
		將字符串str按照radix進制編碼方式轉換爲10進制返回,沒有radix,默認爲10; 
		此方法把任意進制字符串轉爲10進展返回。
		console.log(parseInt('23',8));  //19
		
	toString(radix);
		返回表示該數字的指定進制形式的字符串。
		(把10進制的數據轉爲指定進制,並以字符串形式輸出);
		radix支持 [2, 36] 之間的整數。默認爲10;
		var x = 66;x.toString(16); //“42”
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章