我就是奇迹

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

算法题目(1)

题目解答:编写函数 swapBits

我们需要编写一个 swapBits 函数,接受一个整数 num 和两个位索引 ij,将这两个位置的二进制位交换。然后在 main 函数中,调用该函数对数字 10(二进制 1010)交换第 1 位和第 3 位,输出结果。

思路:

  1. 使用位运算可以很方便地进行二进制位的操作。

  2. 交换第 i 位和第 j 位时,首先判断它们是否相等,如果相等,直接返回原始的数值。

  3. 如果不相等,我们通过如下步骤进行交换:

    • 通过位掩码提取出第 i 位和第 j 位的值。

    • 通过 XOR 运算将它们交换。

具体步骤如下:

  • 提取第 i 位和第 j 位的值。

  • 如果它们的值不同,则交换。

  • 返回修改后的结果。

Python 代码实现:

def swapBits(num, i, j):
    # 检查第 i 位和第 j 位是否相同,如果相同无需交换
    if ((num >> i) & 1) != ((num >> j) & 1):
        # 执行交换,通过异或运算
        num ^= (1 << i)  # 翻转第 i 位
        num ^= (1 << j)  # 翻转第 j 位
    return num

def main():
    # 初始数字 10 (二进制: 1010)
    num = 10
    # 交换第 1 位和第 3 位
    result = swapBits(num, 1, 3)
    print(f"交换后的结果: {result}(二进制: {bin(result)})")

if __name__ == "__main__":
    main()

解释:

  1. swapBits(num, i, j)

    • 我们首先通过 (num >> i) & 1 获取第 i 位的值。类似地, (num >> j) & 1 获取第 j 位的值。

    • 如果这两个值不同,则通过异或操作 ^ 来翻转这两个位置的值。 num ^= (1 << i) 用来翻转第 i 位,num ^= (1 << j) 用来翻转第 j 位。

    • 最后返回修改后的 num

  2. main()

    • main 函数中,我们设定初始值为 num = 10,即二进制为 1010

    • 然后调用 swapBits 函数交换第 1 位和第 3 位,最后输出交换后的结果。

运行结果:

交换后的结果: 5(二进制: 0b101)

解释:
数字 10 的二进制是 1010,交换第 1 位和第 3 位后得到 0101,即数字 5。

posted on 2025-09-17 23:42  我就是奇迹  阅读(6)  评论(0)    收藏  举报