LeetCode 190. Reverse Bits 題解
阿新 • • 發佈:2018-12-27
先給出最先想到的解法,java程式碼如下:
顯而易見還有更簡單的方法——使用位運算: 思路:將32位的無符號整數n右移32次,每次移動取出最低位,賦值給另一個變數result, 對應於n的右移,result對應地左移32次。(result需要先右移,再將n的最低位賦值給result,否則當輸入n=2147483648時,會溢位,因為java的int型別是有符號的,能表示的最大的數是2147483647)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(); } }
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; } }