Это моя лучшая реализация преобразования целых чисел (любого типа) в std :: string.Вы можете удалить шаблон, если собираетесь использовать его только для одного целочисленного типа.Насколько я знаю, я думаю, что существует хороший баланс между безопасностью C ++ и загадочной природой C. Обязательно включите необходимые заголовки.
template<typename T>
std::string bstring(T n){
std::string s;
for(int m = sizeof(n) * 8;m--;){
s.push_back('0'+((n >> m) & 1));
}
return s;
}
Используйте это так,
std::cout << bstring<size_t>(371) << '\n';
Это вывод на моем компьютере (он отличается на каждом компьютере),
0000000000000000000000000000000000000000000000000000000101110011
Обратите внимание, что копируется вся двоичная строка и, таким образом, дополняются нулями, что помогает представлять размер в битах.Таким образом, длина строки равна size_t в битах.
Давайте попробуем целое число со знаком (отрицательное число),
std::cout << bstring<signed int>(-1) << '\n';
Это вывод на моем компьютере (как указано, он отличается на каждом компьютере),
11111111111111111111111111111111
Обратите внимание, что теперь строка стала меньше, это доказывает, что sign int занимает меньше местачем size_t .Как вы можете видеть, мой компьютер использует метод дополнения 2 для представления целых чисел со знаком (отрицательные числа).Теперь вы можете понять, почему unsigned short(-1) > signed int(1)
Вот версия, созданная только для целых чисел со знаком , чтобы сделать эту функцию без шаблонов, т. Е. Использовать ее, если вы собираетесь преобразовать целые числа со знаком в строку.
std::string bstring(int n){
std::string s;
for(int m = sizeof(n) * 8;m--;){
s.push_back('0'+((n >> m) & 1));
}
return s;
}