稀土掘金330. 二进制反码转换问题
问题描述
小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
位,忽略高位部分。
- 只取