C++の応用 - 進数の変換
ナビゲーションに移動
検索に移動
概要
C++において、進数の変換を行う手順を記載する。
16進数から2進数への変換
std::string HexToBin(const std::string &hex)
{
std::string bin;
for(int i = 0; i < hex.length(); i++)
{
if (hex[i] == '0') bin += "0000";
else if(hex[i] == '1') bin += "0001";
else if(hex[i] == '2') bin += "0010";
else if(hex[i] == '3') bin += "0011";
else if(hex[i] == '4') bin += "0100";
else if(hex[i] == '5') bin += "0101";
else if(hex[i] == '6') bin += "0110";
else if(hex[i] == '7') bin += "0111";
else if(hex[i] == '8') bin += "1000";
else if(hex[i] == '9') bin += "1001";
else if(hex[i] == 'A' || hex[i] == 'a') bin += "1010";
else if(hex[i] == 'B' || hex[i] == 'b') bin += "1011";
else if(hex[i] == 'C' || hex[i] == 'c') bin += "1100";
else if(hex[i] == 'D' || hex[i] == 'd') bin += "1101";
else if(hex[i] == 'E' || hex[i] == 'e') bin += "1110";
else if(hex[i] == 'F' || hex[i] == 'f') bin += "1111";
}
return bin;
}
2進数から16進数への変換
std::string BinToHex(const std::string &bin)
{
std::string hex;
std::string bin4;
int len = bin.length();
// 2進数の文字数が4で割り切れるように先頭に0を足す
std::string tmp;
if(len % 4 != 0)
{
for (int i = 0; i < 4 - (len % 4); i++)
{
tmp += "0";
}
}
std::string bin_tmp = tmp + bin;
for(int i = 0; i < bin_tmp.length(); i += 4)
{
bin4 = bin_tmp.substr(i, 4);
if (bin4 == "0000") hex += "0";
else if(bin4 == "0001") hex += "1";
else if(bin4 == "0010") hex += "2";
else if(bin4 == "0011") hex += "3";
else if(bin4 == "0100") hex += "4";
else if(bin4 == "0101") hex += "5";
else if(bin4 == "0110") hex += "6";
else if(bin4 == "0111") hex += "7";
else if(bin4 == "1000") hex += "8";
else if(bin4 == "1001") hex += "9";
else if(bin4 == "1010") hex += "A";
else if(bin4 == "1011") hex += "B";
else if(bin4 == "1100") hex += "C";
else if(bin4 == "1101") hex += "D";
else if(bin4 == "1110") hex += "E";
else if(bin4 == "1111") hex += "F";
}
return hex;
}
10進数から16進数への変換
文字の長さを揃えて、sprintf
関数を使用して変換する。
サイズを指定しない場合、そのままの長さで返す。
std::string IntToHex(int x, int size = 0)
{
char hex_buf[16] = {};
std::sprintf(hex_buf, "%X", x);
std::string hex_str = hex_buf;
if(size == 0)
{
return hex_str;
}
std::string front;
if(x >= 0)
{
front = "0";
}
else
{
front = "F";
}
// 指定のサイズになるまで文字を増やす
int diff = size - hex_str.length();
for(int i = 0; i < diff; i++)
{
hex_str = front + hex_str;
}
// 指定のサイズになるまで文字を減らす
if(diff < 0)
{
hex_str.erase(0, -diff);
}
return hex_str;
}
16進数から符号なし10進数への変換
標準のstrtoul
関数を使用する。
unsigned int HexToUInt(const std::string &hex)
{
return std::strtoul(hex.c_str(), NULL, 16);
}
16進数から符号あり10進数への変換
int HexToInt(const std::string &hex)
{
int result;
if(std::strtoul(hex.substr(0,1).c_str(), NULL, 16) > 7)
{
result = std::strtoul(hex.c_str(), NULL, 16) - 2 * std::pow(2.0, (int)(hex.size() - 1));
}
else
{
result = std::strtoul(hex.c_str(), NULL, 16);
}
return result;
}
10進数から2進数への変換
16進数に変換した後、2進数へ変換する。
std::string IntToBin(int x, int size = 0)
{
std::string bin_str;
bin_str = HexToBin(itoh(x, ceil(size / 4.0)));
if(size == 0)
{
return bin_str;
}
// サイズ調整
int diff = size - bin_str.length();
if(diff < 0)
{
bin_str.erase(0, -diff);
}
return bin_str;
}
2進数から符号なし10進数への変換
unsigned int BinToUInt(const std::string& bin)
{
return std::strtoul(bin.c_str(), NULL, 2);
}
2進数から符号あり10進数への変換
int BinToInt(const std::string &bin)
{
int result = 0;
if(bin[0] == '1')
{
result = std::strtoul(bin.c_str(), NULL, 2) - 2 * std::pow(2.0, (int)(bin.size() - 1));
}
else
{
result = std::strtoul(bin.c_str(), NULL, 2);
}
return result;
}
float型と16進数の変換
はじめに
float型と16進数の変換では、以下に示すint型とfloat型の共用体を定義する。
union intfloat
{
int ival;
float fval;
};
float型から16進数への変換
まず、上記の共用体にfloat型の値を代入して、int型で取り出す。
次に、int型の10進数から16進数に変換する。
std::string ftoh(float finput)
{
IntFloat value = {};
value.fval = finput;
std::string result = IntToHex(value.ival, 8);
return result;
}
16進数からfloat型への変換
まず、16進数から10進数に変換する。
次に、上記の共用体にint型の値を代入して、float型で取り出す。
float htof(const std::string &hex)
{
IntFloat value;
value.ival = HexToInt(hex);
return value.fval;
}