---
# System prepended metadata

title: LeetCode 190. Reverse Bits
tags: [Leetcode]

---

---
title: 'LeetCode 190. Reverse Bits'
disqus: hackmd
---

# LeetCode 190. Reverse Bits



## Description

Reverse bits of a given 32 bits unsigned integer.

Note:

Note that in some languages, such as Java, there is no unsigned integer type. In this case, both input and output will be given as a signed integer type. They should not affect your implementation, as the integer's internal binary representation is the same, whether it is signed or unsigned.

## Example

Input: n = 00000010100101000001111010011100
Output:    964176192 (00111001011110000010100101000000)
Explanation: The input binary string 00000010100101000001111010011100 represents the unsigned integer 43261596, so return 964176192 which its binary representation is 00111001011110000010100101000000.

## Constraints

The input must be a binary string of length 32

## Answer

此題可藉由bit操作將高位元的bit和低位元的bit區分出來，然後位置互換即可。從16位、8位、4位、2位、1位依序交換。


```Cin=
uint32_t reverseBits(uint32_t n) {
    if(n == 0){return 0;}
    n = ((n & 0xFFFF0000) >> 16) | ((n & 0x0000FFFF) << 16);
    n = ((n & 0xFF00FF00) >> 8 ) | ((n & 0x00FF00FF) << 8 );
    n = ((n & 0xF0F0F0F0) >> 4 ) | ((n & 0x0F0F0F0F) << 4 );
    n = ((n & 0xcccccccc) >> 2 ) | ((n & 0x33333333) << 2 );
    n = ((n & 0xaaaaaaaa) >> 1 ) | ((n & 0x55555555) << 1 );
    return n;
}
```

或是用loop依序將0~31 bit的情況取出，若為1就給定，若不為1就往下推進。
```Cin=
uint32_t reverseBits(uint32_t n){
    if(n == 0){return 0;}
    int i = 0;
    uint32_t ans = 0;
    for(i = 0; i<32; i++){
        ans<<=1;
        if(n&1){ans|=1;}
        n>>=1;
    }
    return ans;
}
```


## Link
https://leetcode.com/problems/reverse-bits/
###### tags: `Leetcode` 
