日常刷题-二进制反码转换问题 | 豆包MarsCode AI刷题

49 阅读2分钟

问题描述

小C在学习二进制运算,他了解到每个非负整数都有其二进制表示。例如,整数 5 可以被表示为二进制 "101",整数 11 可以被表示为二进制 "1011",并且除了 N = 0 外,任何二进制表示中都不含前导零。

二进制的反码表示是将每个 1 变为 0,每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。现在小C想知道,给定一个十进制数 N,它的二进制反码对应的十进制数是多少。


测试样例

样例1:

输入:N = 5
输出:2

样例2:

输入:N = 10
输出:5

样例3:

输入:N = 0
输出:1

问题理解

我们需要将一个十进制数 N 转换为其二进制表示,然后求出该二进制表示的反码,最后将反码转换回十进制数。

关键点

  1. 二进制表示:将十进制数 N 转换为二进制字符串。
  2. 反码:将二进制字符串中的 1 变为 00 变为 1
  3. 转换回十进制:将反码后的二进制字符串转换回十进制数。

思路

  1. 特殊情况处理:当 N 为 0 时,其反码为 1
  2. 获取二进制长度:使用 N.bit_length() 获取 N 的二进制表示的长度。
  3. 生成全1的二进制数:通过 (1 << bit_length) - 1 生成一个与 N 二进制表示长度相同的全 1 的二进制数。
  4. 异或运算:通过 N ^ all_ones 得到 N 的二进制反码对应的十进制数。

示例:

假设 N=5N = 5

  • 二进制表示:101
  • 反码:010
  • 反码对应的十进制:0×22+1×21+0×20=20 \times 2^2 + 1 \times 2^1 + 0 \times 2^0 = 2

因此,5 的二进制反码在十进制下是 2

Solutinon

基于以上思想,还有豆包Marscode小助手提供的提示,我们可以轻松的写出Solution代码:

def solution(N: int) -> int:
    if N == 0:
        return 1
    bit_length = N.bit_length()
    all_ones = (1 << bit_length) - 1
    return N ^ all_ones

注意事项:

注意,要想完全100%解决这道题还需要以下注意事项噢:

  1. 特殊情况处理

    • 当 N = 0 时,二进制反码对应的十进制数是 1。这是因为 0 的二进制表示是 "0",其反码是 "1",对应的十进制数是 1
  2. 二进制表示的长度

    • 需要确定 N 的二进制表示的长度。可以使用 N.bit_length() 来获取 N 的二进制表示的位数。
  3. 生成全1的二进制数

    • 为了生成与 N 的二进制表示长度相同的全 1 的二进制数,可以使用 (1 << bit_length) - 1
  4. 异或运算

    • 通过异或运算 N ^ all_ones 可以得到 N 的二进制反码对应的十进制数。