Top.Mail.Ru
Ответы

Как можно улучшить код?

только начинаю изучать дебри с++. подскажите,пожалуйста,как можно улучшить код?
само задание-

Напишите программу, которая переводит переданное её целое число (возможно, отрицательное) в двоичный код. Используйте процедуру.

Входные данные

Входная строка содержит целое число N .

Выходные данные

Программа должна вывести двоичное представление переданного её числа.

Примеры

входные данные

5

выходные данные

101

входные данные

-14

выходные данные

-1110


мое решение-


12345678910111213141516171819202122232425262728293031323334353637
 #include <iostream> 
#include <vector> 
#include <array> 
using namespace std; 
int main(){ 
    int n,o; 
    vector<int> numbers; 
    cin>>n; 
    int d; 
     if(n<0){ 
            int s=n*(-1); 
            d=s; 
      } 
     else{ 
          d=n; 
    } 
    while(d>1){ 
        o=d%2; 
        d=d/2; 
         numbers.push_back(o); 
    } 
    numbers.push_back(d); 
    if(n<0){ 
        cout<<"-"; 
        for(int i=numbers.size() -1;i>=0;i--){ 
            cout<<numbers[i]; 
        } 
    } 
    else 
    { 
        for(int i=numbers.size() -1;i>=0;i--){ 
        cout<<numbers[i]; 
        } 
 
    } 
 
} 
По дате
По Рейтингу
Аватар пользователя
Новичок
12345678910
 #include <bitset> 
#include <iostream> 
using namespace std; 
int main() { 
    cout << ">>> "; 
    int n; 
    cin >> n; 
    bitset<sizeof(n) * 8> bin(n); 
    cout << "<<< " << bin.to_string() << '\n'; 
} 
Аватар пользователя
Мудрец

Очень хорошо, что вы задумались над улучшением кода ибо в нем действительно есть чего улучшать. Сама программа, по идее, нацелена на представление отдельных бит числа, поэтому логично использовать для этих целей битовые операции а не деление, которое, к тому же, на многих простых вычислителях выполняется гораздо медленнее, чем битовые операции. На современных ПК вы эту разницу не заметите, но вот в разного рода микроконтроллерах она будет просто колоссальной. Общая идея в следующем: мы создаем маску с одним установленным битом а потом сдвигаем ее в цикле, чтобы обойти все биты числа. Исходный код ниже демонстрирует эту идею:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
 #include <stdint.h> //  uint32_t 
#include <stdio.h> 
 
void    u32_to_bin( char* buf, size_t buf_size, uint32_t num, char* delim ); 
void    u32_to_bin( char* buf, size_t buf_size, uint32_t num, char* delim ) 
{ 
    size_t  idx = 0; 
    size_t  count = 0; 
    //  1000000 00000000 00000000 00000000 
    uint32_t    mask = 0x80000000; 
    if( buf_size > 0 ) 
    { 
        while( idx < (buf_size-1) && count < 32 ) 
        { 
            if( num & mask ) 
            { 
                buf[idx] = '1'; 
            } 
            else 
            { 
                buf[idx] = '0'; 
            } 
            idx++; 
            count++; 
            if( delim && !(count % 8) && count < 32 && (idx < (buf_size-1)) ) 
            { 
                buf[idx] = *delim; 
                idx++; 
            } 
            mask = mask >> 1; 
        } 
        buf[idx] = '\0'; 
    } 
} 
#define BUF_SIZE    40 
int main( int argc, char* argv[] ) 
{ 
    char    buf[ BUF_SIZE ]; 
    uint32_t    num = 0x80000001; 
    char    delim = '.'; 
    u32_to_bin( buf, BUF_SIZE, num, NULL ); 
    printf("%u (%#x): %s\n", num, num, buf );
    //  То же самое, но с добавлением разделителя для улучшения читаемости
    u32_to_bin( buf, BUF_SIZE, num, &delim ); 
    printf("%u (%#x): %s\n", num, num, buf ); 
    return  0; 
}  

Но и этот код можно улучшить. Если нужна сверхскорость, то можно заранее сделать таблицу из 256 строк с двоичным представлением чисел от 0 до 255 и использовать значение байта как индекс в этой таблице. Это займет всего несколько тактов процессора.