当前位置: 面试刷题>> 颠倒二进制位(经典算法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位的无符号整数。
推荐面试题