1. 程式人生 > >LeetCode 190. Reverse Bits 題解

LeetCode 190. Reverse Bits 題解

 先給出最先想到的解法,java程式碼如下:
public class Solution {

    public int reverseBits(int n) {
    	// 將整數轉為二進位制
        String binaryString = Integer.toBinaryString(n);
        // 二進位制字串反轉
        int length = binaryString.length();
        StringBuffer result = new StringBuffer();
        for(int i=length-1; i>=0; i--){
        	char temp = binaryString.charAt(i);
        	result.append(temp);
        }
        int len = result.length();
        for(int i=len; i<32; i++){
        	result.append('0');
        }
        String temp = new String(result);
        // 將反轉之後的二進位制字串轉為int
        
        // 此處注意:若使用Integer.parseInt(temp,2)則當n=1,3...會溢位出錯。
        // 舉例來說,若n=1,反轉之後的String字串為"10000000000000000000000000000000",表示的整數為2147483648
        // 而2147483648已經超過了32位有符號數的最大範圍,因此丟擲異常
        Long intResult = Long.parseLong(temp, 2);
        return intResult.intValue();       
    }
}
顯而易見還有更簡單的方法——使用位運算: 思路:將32位的無符號整數n右移32次,每次移動取出最低位,賦值給另一個變數result, 對應於n的右移,result對應地左移32次。(result需要先右移,再將n的最低位賦值給result,否則當輸入n=2147483648時,會溢位,因為java的int型別是有符號的,能表示的最大的數是2147483647)
public class Solution {

    public int reverseBits(int n) {
    	int result = 0;
    	for (int i=0; i<32; i++){
    		// 取出n的最低位
    		int least = n & 0x01;
    		// n右移一位
    		n = n >> 1;
    		// 下面兩個步驟需要注意:一定要先左移,再賦值。
    		// 否則當n=2147483648時,result = result | least 會溢位。
    		// 將result左移一位
			result = result << 1;
    		// 將n的最低位加到result最後一位
    		result = result | least;
    	}
    	return result;
    }
}