一、题目解析
题目描述
小C在学习二进制运算,他了解到每个非负整数都有其二进制表示。例如,整数 5 可以被表示为二进制 "101",整数 11 可以被表示为二进制 "1011",并且除了 N = 0 外,任何二进制表示中都不含前导零。
二进制的反码表示是将每个 1 变为 0,每个 0 变为 1。例如,二进制数 "101" 的二进制反码为 "010"。现在小C想知道,给定一个十进制数 N,它的二进制反码对应的十进制数是多少。
1、题目分析
这道题考验对于二进制的掌握程度,理解反码的含义,以及十进制和二进制之间的转换方式,本次题解利用c++的STL库来解决问题。
2、算法分析
使用bitset来获得对应数字的二进制,使用bitset的相关函数to_string()将原数字的二进制形式存到string类型的变量中。 由于使用bitset类型的获得的二进制形式有前导零,为了不影响最终结果,我们需要去除掉string类型变量中的所有前导零。 定义一个变量pos来保存string类型变量中第一位'1'的位置,利用find()函数来取得其位置,使用string类型的substr(pos)函数来获取pos以及其后的所有数据。 在这里我们要考虑一个特殊情况,如果string类型变量为"0",即没有找到第一个'1'的位置,则不需要使用substr()来获取后面的数据。 之后使用for循环以及if语句判断来实现反码操作。 利用函数stoi()将反码后的二进制字符串转换回十进制数,得到最终结果。
代码实现
#include <iostream>
#include <bitset>
#include <string>
int solution(int N) {
std::string binary = std::bitset<32>(N).to_string();
size_t pos = binary.find('1');
if (pos != std::string::npos) {
binary = binary.substr(pos);
} else {
binary = "0";
}
for (char &c : binary) {
if (c == '0') c = '1';
else if (c == '1') c = '0';
}
int result = std::stoi(binary, nullptr, 2);
return result;
}
二、知识总结
利用了STL里面的string类型和bitset类型 bitset用于解决二进制问题非常方便,一般使用bitset<32>b1(n)将数字n转变为32位的二进制形式。bitset类型所具有的函数to_string()函数可以将内容转变为string类型进行储存。 string类型里面的find()函数和substr()函数相互配合,可以方便的截取到自己需要的数据片段。 stoi()函数可以将string类型符合要求的变量转变为int类型。