Как преобразовать интервал в представление двоичной строки в C++

У меня есть интервал, который я хочу сохранить как представление двоичной строки. Как это может быть сделано?

15
задан Tod 24 May 2012 в 07:04
поделиться

6 ответов

У меня есть int, который я хочу сначала преобразовать в двоичное число.

Что именно это означает? Типа «двоичное число» не существует. Ну, int уже представлен в двоичной форме внутри, если вы не используете очень странный компьютер, но это деталь реализации - концептуально это просто целое число.

Каждый раз, когда вы выводите число на экран, оно должно быть преобразовано в строку символов. Так уж получилось, что большинство систем ввода-вывода выбрали десятичное представление для этого процесса, чтобы людям было легче. Но в int нет ничего десятичного.

В любом случае, чтобы сгенерировать базовое b представление целого числа x , просто следуйте этому алгоритму:

  1. инициализируйте s пустой строкой

  2. m = x% b

  3. x = x / b

  4. Преобразует m в цифру d .

  5. Добавить d на s .

  6. Если x не равно нулю, перейдите к шагу 2.

  7. Обратный 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);
}
14
ответ дан 1 December 2019 в 00:07
поделиться

http: // snippets .dzone.com / posts / show / 4716 или http://www.phanderson.com/printer/bin_disp.html - два хороших примера.

Основной принцип простого подхода:

  • Цикл, пока # не станет 0
  • & (побитовое и) # с 1. Распечатайте результат (1 или 0) до конца строкового буфера .
  • Сдвиньте # на 1 бит, используя >> = .
  • Повторить цикл
  • Печать буфера перевернутой строки

Чтобы избежать переворота строки или необходимости ограничивать себя количеством #, соответствующих длине строки буфера, вы можете:

  • Вычислить потолок (log2 (N)) - скажем L
  • Вычислить маску = 2 ^ L
  • Цикл до маски == 0:
    • & (побитовое и) маска с #. Выведите результат (1 или 0).
    • число & = (маска-1)
    • маска >> = 1 (разделить на 2)
2
ответ дан 1 December 2019 в 00:07
поделиться

Попробуйте следующее:

#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";
}
39
ответ дан 1 December 2019 в 00:07
поделиться

Прямой функции нет, вы можете просто пройтись по битам int (подсказка см. >> ) и вставить '1' или '0' в строку.
Звучит как стандартный вопрос типа интервью / домашнего задания

0
ответ дан 1 December 2019 в 00:07
поделиться

Полагаю, это связано с другим вашим вопросом о расширяемом хешировании.

Сначала определите некоторые мнемоники для ваших битов:

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 после каждой итерации.

1
ответ дан 1 December 2019 в 00:07
поделиться

Используйте функцию sprintf для сохранения форматированного вывода в строковой переменной вместо printf для прямой печати. Однако обратите внимание, что эти функции работают только со строками C, но не со строками C ++.

0
ответ дан 1 December 2019 в 00:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: