問題描述:
顛倒給定的 32 位無符號整數的二進制位,
示例 1:
輸入: 00000010100101000001111010011100
輸出: 00111001011110000010100101000000
解釋: 輸入的二進制串 00000010100101000001111010011100 表示無符號整數 43261596,
因此回傳 964176192,其二進制表示形式為 00111001011110000010100101000000,
示例 2:
輸入:11111111111111111111111111111101
輸出:10111111111111111111111111111111
解釋:輸入的二進制串 11111111111111111111111111111101 表示無符號整數 4294967293,
因此回傳 3221225471 其二進制表示形式為 10111111111111111111111111111111 ,
提示:
請注意,在某些語言(如 Java)中,沒有無符號整數型別,在這種情況下,輸入和輸出都將被指定為有符號整數型別,并且不應影響您的實作,因為無論整數是有符號的還是無符號的,其內部的二進制表示形式都是相同的,
在 Java 中,編譯器使用二進制補碼記法來表示有符號整數,因此,在上面的 示例 2 中,輸入表示有符號整數 -3,輸出表示有符號整數 -1073741825,
解題思路:
1、對二進制數進行翻轉,類似于整數翻轉,需要先獲得二進制數的末位,可以通過與運算實作(n & 1),
&運算滿足兩個同為1,結果才為1,否則為0,這里和1作與運算,最后得到的結果與n的末位相同,
2、獲取末位值后,需要獲得倒數第二位數值,這里通過移位即可實作:n>>1,使倒數第二位移至末位,我們只需位移 32 次,就能獲得 n 的所有二進制位值,
3.使用 res對各個二進制位進行保存,
實作代碼
public class Solution {
// you need treat n as an unsigned value
public int reverseBits(int n) {
int res=0; //用res保存n的各個二進制位
for(int i=0;i<32;i++){
//這里讓res先左移的原因是因為從最后一個位開始,每個位左移32-i位,則第1位左移31次,所以res左移放在最前面
res=res<<1;
//如果當前n的末位是1,那么res++,保證左移完后,res的該位也為1
if((n & 1)==1){
res++;
}
//n右移,得到n的倒數第i位
n=n>>1;
}
return res;
}
}
注意點:
Java中沒有無符號數,只有有符號數,有符號數的移位是算術移位
算術移位的物件是有符號數,在移位程序中符號位保持不變,
對于正數,移位后出現的空位均以0填充,
對于負數,負數的原碼數值部分與真值相同,移位時符號位不變,空位添0
負數的反碼各位除符號位外與負數的原碼正好相反,故移位后所添的代碼應該與原碼相反,全部添1
所以,Java中負數右移得到的結果仍然是負數,
這里如果顛倒二進制位從高位向低位填充時,可能會出現錯誤,
如題主一開始寫的代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262556.html
標籤:其他
