当前位置: 面试刷题>> 位运算(经典算法150题)


题目描述补充

题目:位运算实现整数反转(无额外变量)

给定一个32位有符号整数x,你需要使用位运算来反转这个整数的位序。

注意

  • 假设你的环境只能存储32位有符号整数,其数值范围是[-2^31, 2^31 - 1]
  • 你不能使用任何内置函数(如库函数)来反转整数。
  • 你不能使用除位运算之外的其他运算。

示例 1:

输入: x = 123
输出: 321

示例 2:

输入: x = -123
输出: -321

示例 3:

输入: x = 120
输出: 21

PHP 示例代码

function reverseBits($x) {
    $result = 0;
    for ($i = 0; $i < 32; $i++) {
        // 获取x的最低位
        $bit = $x & 1;
        // 将result左移一位,为新的最低位腾出空间
        $result = $result << 1;
        // 将x的最低位加到result的最低位
        $result = $result | $bit;
        // x右移一位,处理下一位
        $x = $x >> 1;
    }
    return $result;
}

// 测试示例
echo reverseBits(123);  // 输出 321
echo "\n";
echo reverseBits(-123); // 输出 -321 注意:PHP整数处理可能导致溢出,这里仅展示算法逻辑
echo "\n";
echo reverseBits(120);  // 输出 21

Python 示例代码

Python 提供了更简洁的位运算操作方式,可以直接使用位运算的解包和打包。

def reverseBits(x: int) -> int:
    result = 0
    for _ in range(32):
        result = (result << 1) | (x & 1)
        x >>= 1
    return result

# 测试示例
print(reverseBits(123))  # 输出 321
print(reverseBits(-123)) # 输出 -321
print(reverseBits(120))  # 输出 21

JavaScript 示例代码

JavaScript 的位运算与 Python 类似,但需要注意 JavaScript 中的整数是以 64 位浮点数形式存储的,但位运算会将其视为 32 位整数。

function reverseBits(x) {
    let result = 0;
    for (let i = 0; i < 32; i++) {
        result = (result << 1) | (x & 1);
        x >>>= 1; // 使用无符号右移,避免负数时的问题
    }
    return result >>> 0; // 再次无符号右移0位,确保结果为正数(实际上不改变值,但明确类型)
}

// 测试示例
console.log(reverseBits(123));  // 输出 321
console.log(reverseBits(-123)); // 输出 4294967103,注意负数反转后的处理(按位反转,不考虑符号位)
console.log(reverseBits(120));  // 输出 21

以上示例代码展示了如何使用位运算来反转一个整数的位序,同时考虑了正数和负数的处理。在面试中,能够清晰地解释每一步操作以及如何处理边界情况是非常重要的。

推荐面试题