PC のビジュアル スタジオでは、itoa() を使用して、基数 10 の int から基数 2 の c-string に変換できます。ただし、Linux マシンを使用している場合、その機能はサポートされていません。この種の変換を行う別の簡単な方法はありますか? 文字列ストリームの使用方法を知っており、分割と改造を使用して別のベースに手動で変換できます。
私は、int のバイナリ表現にアクセスする簡単な方法があると思っていました。
std::bitset<N>
適切なN
(例std::numeric_limits<int>::digits
: )で使用できます。
std::string bits = std::bitset<10>(value).to_string();
int
s は単に値を表すことに注意してください。これらは確かに基数 10 ではありませんが、これはそれらをフォーマットするときに使用されるデフォルトの基数です (これは、 および を使用して 8 進数または 16 進数に簡単に変更できますstd::oct
) std::hex
。どちらかといえば、int
s は実際には基数 2 を使用して表されます。
Cでも同じ:
short UtilLitoa(long value, char* str, short base);
void UtilStrReverse(char* begin, char* end);
static const char c36Digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
short UtilLitoa(long value, char* str, short base)
{
char* wstr=str;
int sign;
unsigned long res;
/* Validate base */
if (base<2 || base>36)
{
if(str!=NULL)
*str='\0';
return(0);
}
/* Take care of sign */
if ((sign=value) < 0)
value = -value;
res=value;
/* Conversion. Number is reversed */
do
{
value=(long)res;
res=res/base;
if(str!=NULL)
*wstr = c36Digits[(unsigned long)value-res*base];
wstr++;
}
while(res);
if(sign<0)
*wstr++='-';
*wstr='\0';
/* Reverse string */
UtilStrReverse(str, wstr-1);
return(wstr-str);
}
void UtilStrReverse(char* begin, char* end)
{
char aux;
if(begin==NULL)
return;
if(end==NULL)
end=begin+strlen(begin)-1;
while(end>begin)
{
aux=*end;
*end--=*begin;
*begin++=aux;
}
}
C++ の最も簡単な解決策string
:
std::string to_bin(unsigned int value) {
if (value == 0) return "0";
std::string result;
while (value != 0) {
result += '0' + (value & 1);
value >>= 1;
}
std::reverse(result.begin(), result.end());
return result;
}
異なるベース (2 <= ベース <= 36) の場合:
std::string to_base(unsigned int value, int base) {
if (value == 0) return "0";
std::string result;
while (value != 0) {
int digit = value % base;
result += (digit > 9 ? 'A' + digit - 10 : digit +'0');
value /= base;
}
std::reverse(result.begin(), result.end());
return s;
}
int
編集: 引数を からに変更して負の数を修正unsigned int
さらに別のバージョン
#include <string>
#include <limits>
#include <iostream>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
template <class Number> void toBinaryRepresentation(
const Number& n,
std::string& str,
const bool reverse = false)
{
std::size_t i,j; // iterators
const std::size_t numbits = std::numeric_limits<unsigned char>::digits;
const char *raw = reinterpret_cast<const char*>(&n);
str.resize(sizeof(n) * numbits);
for (i = 0; i != sizeof(n); ++i)
{
for (j = 0; j < numbits; ++j)
{
str[i * numbits + j] = ((raw[i] >> j) & 1) + 48;
}
}
if (reverse == false) std::reverse(str.begin(), str.end());
}
int main(int argc, char *argv[]) {
if (argc != 3)
{
std::cerr << "Usage: " << argv[0];
std::cerr << " [int|long|float] [number]" << std::endl;
return -1;
}
#define test_start(type, from_string_to_type) \
if (std::strcmp(argv[1], TOSTRING(type)) == 0) { \
const type num = from_string_to_type(argv[2]); \
toBinaryRepresentation(num, binary); \
std::cout << binary << std::endl; \
}
#define test(type, from_string_to_type) \
else if (std::strcmp(argv[1], TOSTRING(type)) == 0) { \
const type num = from_string_to_type(argv[2]); \
toBinaryRepresentation(num, binary); \
std::cout << binary << std::endl; \
}
std::string binary;
test_start(int, std::atoi)
test(long, std::atol)
test(float, std::atof)
#undef test_start
#undef test
return 0;
}