Как можно улучшить код?
только начинаю изучать дебри с++. подскажите,пожалуйста,как можно улучшить код?
само задание-
Напишите программу, которая переводит переданное её целое число (возможно, отрицательное) в двоичный код. Используйте процедуру.
Входные данные
Входная строка содержит целое число N .
Выходные данные
Программа должна вывести двоичное представление переданного её числа.
Примеры
входные данные
5
выходные данные
101
входные данные
-14
выходные данные
-1110
мое решение-
#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];
}
}
}
#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';
}
Очень хорошо, что вы задумались над улучшением кода ибо в нем действительно есть чего улучшать. Сама программа, по идее, нацелена на представление отдельных бит числа, поэтому логично использовать для этих целей битовые операции а не деление, которое, к тому же, на многих простых вычислителях выполняется гораздо медленнее, чем битовые операции. На современных ПК вы эту разницу не заметите, но вот в разного рода микроконтроллерах она будет просто колоссальной. Общая идея в следующем: мы создаем маску с одним установленным битом а потом сдвигаем ее в цикле, чтобы обойти все биты числа. Исходный код ниже демонстрирует эту идею:
#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 и использовать значение байта как индекс в этой таблице. Это займет всего несколько тактов процессора.