C++ - Десятичное число к двоичному преобразованию

Я записал 'простое' (мне потребовались 30 минут), программа, которая преобразовывает десятичное число в двоичный файл. Я УВЕРЕН, что существует намного более простой путь, таким образом, можно показать мне? Вот код:

#include <iostream>
#include <stdlib.h>

using namespace std;
int a1, a2, remainder;
int tab = 0;
int maxtab = 0;
int table[0];
int main()
{
    system("clear");
    cout << "Enter a decimal number: ";
    cin >> a1;
    a2 = a1; //we need our number for later on so we save it in another variable

    while (a1!=0) //dividing by two until we hit 0
    {
        remainder = a1%2; //getting a remainder - decimal number(1 or 0)
        a1 = a1/2; //dividing our number by two
        maxtab++; //+1 to max elements of the table
    }

    maxtab--; //-1 to max elements of the table (when dividing finishes it adds 1 additional elemnt that we don't want and it's equal to 0)
    a1 = a2; //we must do calculations one more time so we're gatting back our original number
    table[0] = table[maxtab]; //we set the number of elements in our table to maxtab (we don't get 10's of 0's)

    while (a1!=0) //same calculations 2nd time but adding every 1 or 0 (remainder) to separate element in table
    {
        remainder = a1%2; //getting a remainder
        a1 = a1/2; //dividing by 2
        table[tab] = remainder; //adding 0 or 1 to an element
        tab++; //tab (element count) increases by 1 so next remainder is saved in another element
    }

    tab--; //same as with maxtab--
    cout << "Your binary number: ";

    while (tab>=0) //until we get to the 0 (1st) element of the table
    {
        cout << table[tab] << " "; //write the value of an element (0 or 1)
        tab--; //decreasing by 1 so we show 0's and 1's FROM THE BACK (correct way)
    }

    cout << endl;
    return 0;
}

По тому, как это сложно, но я старался изо всех сил.

редактирование - Вот является решением, которое я закончил тем, что использовал:

std::string toBinary(int n)
{
    std::string r;
    while(n!=0) {r=(n%2==0 ?"0":"1")+r; n/=2;}
    return r;
}
60
задан 3 April 2017 в 23:10

5 ответов

Преобразование от натурального числа до двоичной строки:

string toBinary(int n) {
    if (n==0) return "0";
    else if (n==1) return "1";
    else if (n%2 == 0) return toBinary(n/2) + "0";
    else if (n%2 != 0) return toBinary(n/2) + "1";
}
0
ответ дан 31 October 2019 в 16:49

В этом подходе десятичное число будет преобразовано в соответствующее двоичное число в строке formate. строковый тип возврата выбран, так как он может обработать больше диапазона входных значений.

class Solution {
public:
  string ConvertToBinary(int num) 
  {
    vector<int> bin;
    string op;
    for (int i = 0; num > 0; i++)
    {
      bin.push_back(num % 2);
      num /= 2;
    }
    reverse(bin.begin(), bin.end());
    for (size_t i = 0; i < bin.size(); ++i)
    {
      op += to_string(bin[i]);
    }
    return op;
  }
};
0
ответ дан 31 October 2019 в 16:49
#include <iostream>

// x is our number to test
// pow is a power of 2 (e.g. 128, 64, 32, etc...)
int printandDecrementBit(int x, int pow)
{
    // Test whether our x is greater than some power of 2 and print the bit
    if (x >= pow)
    {
        std::cout << "1";
        // If x is greater than our power of 2, subtract the power of 2
        return x - pow;
    }
    else
    {
        std::cout << "0";
        return x;
    }
}

int main()
{
    std::cout << "Enter an integer between 0 and 255: ";
    int x;
    std::cin >> x;

    x = printandDecrementBit(x, 128);
    x = printandDecrementBit(x, 64);
    x = printandDecrementBit(x, 32);
    x = printandDecrementBit(x, 16);

    std::cout << " ";

    x = printandDecrementBit(x, 8);
    x = printandDecrementBit(x, 4);
    x = printandDecrementBit(x, 2);
    x = printandDecrementBit(x, 1);

    return 0;
}

это - простой способ получить двоичную форму международного кредита на learncpp.com. Я уверен, что это могло использоваться по-разному для получения до той же точки.

0
ответ дан 31 October 2019 в 16:49

Хорошо.. Я мог бы быть немного плохо знаком с C++, но я чувствую, что вышеупомянутые примеры не вполне сделали задание правильно.

Вот мое взятие на этой ситуации.

char* DecimalToBinary(unsigned __int64 value, int bit_precision)
{
    int length = (bit_precision + 7) >> 3 << 3;
    static char* binary = new char[1 + length];
    int begin = length - bit_precision;
    unsigned __int64 bit_value = 1;
    for (int n = length; --n >= begin; )
    {
        binary[n] = 48 | ((value & bit_value) == bit_value);
        bit_value <<= 1;
    }
    for (int n = begin; --n >= 0; )
        binary[n] = 48;

    binary[length] = 0;
    return binary;
}

@value = Значение мы проверяем.

@bit_precision = самое высокое левое большая часть бита для проверки на.

@Length = Максимальный Размер блока Байта. Например, 7 = 1 байт и 9 = 2 байта, но мы представляем это в форме битов так 1 байт = 8 битов.

@binary = просто некоторое немое имя я дал для вызова массива символов, которые мы устанавливаем. Мы устанавливаем это на помехи, таким образом, они не будут воссозданы с каждым вызовом. Для того, чтобы просто получить результат и дисплей это затем это работает хорошее, но если бы скажем, Вы хотели отобразить несколько результатов на UI, то они все обнаружились бы как последний результат. Это может быть зафиксировано путем удаления статичный, но удостовериться, что Вы удаляете [] результаты, когда Вы сделаны с ним.

@begin = Это - самый низкий индекс, который мы проверяем. Все вне этой точки проигнорировано. Или как показано в 2-м наборе цикла к 0.

@first цикл - Здесь мы устанавливаем значение к 48 и в основном добавляем 0, или 1 - 48 на основе bool значения (оцените & bit_value) == bit_value. Если это верно, что символ установлен на 49. Если это - ложь, символ установлен на 48. Затем мы смещаем bit_value или в основном умножаем его на 2.

@second цикл - Здесь мы устанавливаем все индексы, которые мы проигнорировали к 48 или '0'.

НЕКОТОРЫЕ ВЫВОДЫ В КАЧЕСТВЕ ПРИМЕРА!!!

int main()
{
    int val = -1;
    std::cout << DecimalToBinary(val, 1) << '\n';
    std::cout << DecimalToBinary(val, 3) << '\n';
    std::cout << DecimalToBinary(val, 7) << '\n';
    std::cout << DecimalToBinary(val, 33) << '\n';
    std::cout << DecimalToBinary(val, 64) << '\n';
    std::cout << "\nPress any key to continue. . .";
    std::cin.ignore();
    return 0;
}

00000001 //Value = 2^1 - 1
00000111 //Value = 2^3 - 1.
01111111 //Value = 2^7 - 1.
0000000111111111111111111111111111111111 //Value = 2^33 - 1.
1111111111111111111111111111111111111111111111111111111111111111 //Value = 2^64 - 1.

ТЕСТЫ СКОРОСТИ

Ответ Исходного Вопроса: "Метод: toBinary (интервал)";

Выполнение: 10,000, Общее время (Milli): 4701.15, Среднее Время (Наносекунды): 470114

Моя Версия: "Метод: DecimalToBinary (интервал, интервал)";

//Используя Точность на 64 бита.

Выполнение: 10,000,000, Общее время (Milli): 3386, Среднее Время (Наносекунды): 338

//Используя Точность на 1 бит.

Выполнение: 10,000,000, Общее время (Milli): 634, Среднее Время (Наносекунды): 63

0
ответ дан 31 October 2019 в 16:49

Вот современный вариант, который может использоваться для ints из различных размеров.

#include <type_traits>
#include <bitset>

template<typename T>
std::enable_if_t<std::is_integral_v<T>,std::string>
encode_binary(T i){
    return std::bitset<sizeof(T) * 8>(i).to_string();
}
1
ответ дан 31 October 2019 в 16:49

Другие вопросы по тегам:

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