У меня есть интервал, который я хочу сохранить как представление двоичной строки. Как это может быть сделано?
У меня есть int, который я хочу сначала преобразовать в двоичное число.
Что именно это означает? Типа «двоичное число» не существует. Ну, int
уже представлен в двоичной форме внутри, если вы не используете очень странный компьютер, но это деталь реализации - концептуально это просто целое число.
Каждый раз, когда вы выводите число на экран, оно должно быть преобразовано в строку символов. Так уж получилось, что большинство систем ввода-вывода выбрали десятичное представление для этого процесса, чтобы людям было легче. Но в int
нет ничего десятичного.
В любом случае, чтобы сгенерировать базовое b
представление целого числа x
, просто следуйте этому алгоритму:
инициализируйте s
пустой строкой
m = x% b
x = x / b
Преобразует m
в цифру d
.
Добавить d
на s
.
Если x
не равно нулю, перейдите к шагу 2.
Обратный s
Шаг 4 прост, если b <= 10
и ваш компьютер использует кодировка символов, в которой цифры 0-9 идут подряд, потому что тогда это просто d = '0' + m
. В противном случае вам понадобится справочная таблица.
Шаги 5 и 7 можно упростить, добавив d
слева от s
, если вы заранее знаете, сколько места вам понадобится, и начните с правого конца в нить.
В случае b == 2
(например,двоичное представление), шаг 2 можно упростить до m = x & 1
, а шаг 3 можно упростить до x = x >> 1
.
reverse
: #include <string>
#include <algorithm>
std::string binary(unsigned x)
{
std::string s;
do
{
s.push_back('0' + (x & 1));
} while (x >>= 1);
std::reverse(s.begin(), s.end());
return s;
}
reverse
: #include <string>
std::string binary(unsigned x)
{
// Warning: this breaks for numbers with more than 64 bits
char buffer[64];
char* p = buffer + 64;
do
{
*--p = '0' + (x & 1);
} while (x >>= 1);
return std::string(p, buffer + 64);
}
http: // snippets .dzone.com / posts / show / 4716 или http://www.phanderson.com/printer/bin_disp.html - два хороших примера.
Основной принцип простого подхода:
&
(побитовое и) # с 1. Распечатайте результат (1 или 0) до конца строкового буфера . >> =
. Чтобы избежать переворота строки или необходимости ограничивать себя количеством #, соответствующих длине строки буфера, вы можете:
&
(побитовое и) маска с #. Выведите результат (1 или 0). Попробуйте следующее:
#include <bitset>
#include <iostream>
int main()
{
std::bitset<32> x(23456);
std::cout << x << "\n";
// If you don't want a variable just create a temporary.
std::cout << std::bitset<32>(23456) << "\n";
}
Прямой функции нет, вы можете просто пройтись по битам int (подсказка см. >> ) и вставить '1' или '0' в строку.
Звучит как стандартный вопрос типа интервью / домашнего задания
Полагаю, это связано с другим вашим вопросом о расширяемом хешировании.
Сначала определите некоторые мнемоники для ваших битов:
const int FIRST_BIT = 0x1;
const int SECOND_BIT = 0x2;
const int THIRD_BIT = 0x4;
Затем у вас есть номер, который вы хотите преобразовать в битовую строку:
int x = someValue;
Вы можете проверить, установлен ли бит, используя логические &
оператор.
if(x & FIRST_BIT)
{
// The first bit is set.
}
Вы можете сохранить std :: string и добавить 1 к этой строке, если бит установлен, и добавить 0, если бит не установлен. В зависимости от того, в каком порядке вы хотите разместить строку, вы можете начать с последнего бита и перейти к первому или только от первого до последнего.
Вы можете преобразовать это в цикл и использовать его для чисел произвольного размера, вычислив приведенные выше мнемонические биты с помощью current_bit_value << = 1 после каждой итерации.
Используйте функцию sprintf
для сохранения форматированного вывода в строковой переменной вместо printf
для прямой печати. Однако обратите внимание, что эти функции работают только со строками C, но не со строками C ++.