1. 程式人生 > >LeetCode 190. Reverse Bits 顛倒二進位制位

LeetCode 190. Reverse Bits 顛倒二進位制位

題目:

顛倒給定的 32 位無符號整數的二進位制位。

示例:

輸入: 43261596
輸出: 964176192
解釋: 43261596 的二進位制表示形式為 00000010100101000001111010011100 ,
     返回 964176192,其二進位制表示形式為 00111001011110000010100101000000 

進階:
如果多次呼叫這個函式,你將如何優化你的演算法?

解題思路:

從末尾開始每一次都提取最後的一位,然後乘以基數2。

也可以通過對整體進行塊變換,達到翻轉的目的。

程式碼實現:

基本版:

public class Solution {
// you need treat n as an unsigned value
public int reverseBits
(int n) { int res = 0; for (int i = 0; i < 32; i ++) { res <<= 1; res += n & 1; n >>= 1; } return res; } }

塊變換:

public class Solution {
// you need treat n as an unsigned value
public int reverseBits(int n) {
n = (n << 16) | (n >>> 16);
n = ((n & 0x00ff00ff) << 8) | 
((n & 0xff00ff00) >>> 8); n = ((n & 0x0f0f0f0f) << 4) | ((n & 0xf0f0f0f0) >>> 4); n = ((n & 0x33333333) << 2) | ((n & 0xcccccccc) >>> 2); n = ((n & 0x55555555) << 1) | ((n & 0xaaaaaaaa) >>> 1); return n; } }