稀土掘金330. 二进制反码转换问题

2025-02-23T11:15:03

问题描述

小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

代码:

int solution(int N) {
    if (N == 0) {
        return 1;
    }
    int bits = std::log2(N) + 1;
    std::bitset<32> binary(N);
    std::bitset<32> inverted = ~binary;
    int result = (inverted.to_ulong() & ((1 << bits) - 1));
    return result;
}

解释

  • std::log2(N) + 1:

    • 计算 N 的二进制位数。
  • std::bitset<32> binary(N);:

    • 这行代码将整数 N 转换为一个 32 位的二进制表示。
  • std::bitset<32> inverted = ~binary;:

    • 这行代码对 binary 进行按位取反操作,得到 inverted
  • int result = inverted.to_ulong();:

    • 这行代码将 inverted 转换回无符号长整型。
  • (1 << bits) - 1:

    • 生成一个掩码,只保留低 bits 位。
  • inverted.to_ulong() & ((1 << bits) - 1):

    • 只取 inverted 的低 bits 位,忽略高位部分。
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »