稀土掘金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位,忽略高位部分。
- 只取
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »