当前位置: 面试刷题>> 颠倒二进制位(经典算法150题)
### 题目描述
**颠倒二进制位**
给定一个32位无符号整数 `n`,你需要将这个数翻转其二进制位。例如,输入 `43261596`(其二进制表示为 `00000010100101000001111010011100`),则返回 `964176192`(其二进制表示为 `00111001011110000010100101000000`)。
**提示**:
1. 请注意,在某些语言(如 Java)中,整数没有无符号整数类型。但是,在本题中,我们将输入的整数视为无符号的 32 位整数,并假设你的函数可以返回相同类型的值。
2. 你的函数应该返回翻转后的整数,而不是字符串。
### PHP 示例代码
```php
function reverseBits($n) {
$result = 0;
for ($i = 0; $i < 32; $i++) {
$result = ($result << 1) | ($n & 1);
$n >>= 1;
}
return $result;
}
// 示例
$n = 43261596;
echo reverseBits($n); // 输出 964176192
```
### Python 示例代码
```python
def reverseBits(n: int) -> int:
result = 0
for _ in range(32):
result = (result << 1) | (n & 1)
n >>= 1
return result
# 示例
n = 43261596
print(reverseBits(n)) # 输出 964176192
```
### JavaScript 示例代码
```javascript
function reverseBits(n) {
let result = 0;
for (let i = 0; i < 32; i++) {
result = (result << 1) | (n & 1);
n >>= 1;
}
return result >>> 0; // 使用无符号右移来确保结果是非负的
}
// 示例
let n = 43261596;
console.log(reverseBits(n)); // 输出 964176192
```
在解答这道题目时,我们使用了位运算来逐位翻转给定的整数。具体来说,我们通过循环32次(因为题目中给定的是32位无符号整数),在每次循环中,我们先将`result`左移一位(相当于在其二进制表示的末尾添加一个0),然后将`n`的最低位(通过`n & 1`得到)添加到`result`的最低位上,之后将`n`右移一位。这样,通过32次循环,我们就能得到`n`的二进制位翻转后的结果。
在JavaScript的示例中,我使用了`>>>`操作符来进行无符号右移,这是为了确保最终的结果是一个非负的整数,尽管在JavaScript中所有的数字都是以64位浮点数形式存储的,但这个操作符可以帮助我们模拟无符号整数的行为。不过,在这个特定的例子中,由于我们是在处理32位整数,并且始终在进行位运算,所以最终的结果仍然可以看作是一个32位的无符号整数。