LeetCode:Number of 1 Bits - 整數的漢明重量

一、題目名稱java

Number of 1 Bits(整數的漢明重量)函數

二、題目地址ui

https://leetcode.com/problems/number-of-1-bits/
code

三、題目內容leetcode

英文:Write a function that takes an unsigned integer and returns the number of ’1' bits it has.開發

中文:寫一個函數,輸入一個無符號整數,返回其中值爲1的比特位的個數(這個值也被稱爲數字漢明重量)get

例如,32位整型數字11的能夠用二進制數字「00000000000000000000000000001011」表示,它的漢明重量就是3。it

四、解題方法io

本問題可使用位運算來解決。每次循環都將數字右移一位,而後觀察移位後的數字是奇數仍是偶數,若是是奇數說明最後一位是1,不然說明最後一位是0。當最後輸入的數字通過不斷的右移變爲0時,結束循環。function

一開始我寫的代碼是這樣的:

/**
 * 功能說明:LeetCode 191 - Number of 1 Bits
 * 開發人員:Tsybius2014
 * 開發時間:2015年8月12日
 */
public class Solution {

    /**
     * 求數字的漢明重量
     * @param n 數字
     * @return 漢明重量
     */
    public int hammingWeight(int n) {
        
        int counter = 0;
        while (n != 0)
        {
            if (n % 2 != 0) {
                counter++;
            }
            n = n >> 1;
        }
        return counter;
    }
}

不過這段「看上去沒有什麼問題」的代碼在提交後會爆出TLE(Time Limit Exceeded)的錯誤。

後來我找了一下緣由,發現致使斷定出錯時輸入爲2147483648,但這個輸入超過了Java語言中整型的上限。後來我看了一下其餘語言的題目,好比C++是這樣的:

class Solution {
public:
    int hammingWeight(uint32_t n) {   

    }
};

原來問題就出在輸入多是無符號數字上!當輸入爲2147483648時,Java會將這個數字判斷位-1,而右移符號>>在計算時會保持數字的符號位,即正數右移高位補0,負數右移高位補1。使用這種規則進行右移,會致使數字在右移過程當中被不斷補1,這樣循環永遠沒法中止!所以,若是輸入爲負數,也應該保持右移時高位補0,位運算符>>>能夠幫助咱們解決這個問題。

一段能夠AC的Java代碼以下:

/**
 * 功能說明:LeetCode 191 - Number of 1 Bits
 * 開發人員:Tsybius2014
 * 開發時間:2015年8月12日
 */
public class Solution {

    /**
     * 求數字的漢明重量
     * @param n 數字
     * @return 漢明重量
     */
    public int hammingWeight(int n) {
        
        int counter = 0;
        while (n != 0)
        {
            if (n % 2 != 0) {
                counter++;
            }
            n = n >>> 1;
        }
        return counter;
    }
}

附:Java中的三個用於移位的位運算符:>>、<<、>>>

  1. >>是帶符號右移,負數高位補1,正數補0

  2. <<左移無論負數仍是正數,在低位永遠補0

  3. >>>是不帶符號右移,不論負數仍是正數,高位補0

END

相關文章
相關標籤/搜索