2016-10-19 2 views
4

Я хочу создать простую программу, которая будет принимать количество бит от входа и в качестве выходных двоичных чисел, записанных на заданных битах (пример: I type 3: показывает 000, 001, 010, 011, 100, 101, 110, 111). Единственная проблема, которую я получаю во втором для -loop, когда я пытаюсь присвоить переменные в BitSet < бит>, но оно хочет постоянное число. Если бы вы могли помочь мне найти решение, я бы очень понравился. Вот код:C++ Как назначить входное значение аргументу std :: bitset?

#include <iostream> 
#include <bitset> 
#include <cmath> 

using namespace std; 

int main() { 
    int maximum_value = 0,x_temp=10; 
    //cin >> x_temp; 
    int const bits = x_temp; 

    for (int i = 1; i <= bits; i++) { 
     maximum_value += pow(2, bits - i); 
    } 
    for (int i = maximum_value; i >= 0; i--) 
     cout << bitset<bits>(maximum_value - i) << endl; 
    return 0; 
} 
+0

Возможные дубликата [Преобразование целого числа в битах] (http://stackoverflow.com/questions/6038718/convert-integer-to-bits) –

+0

Ответ этот вопрос зависит от числа, которое известно во время компиляции. Не подходит для нужд ОП. –

+0

Если вы не хотите использовать 'std :: bitset', вы можете использовать это решение в http://stackoverflow.com/questions/23173261/int-to-binary-conversion-explanation. –

ответ

1

Числовой («не-типа», так как C++ называет) параметр шаблона должен быть постоянным во время компиляции, так что вы не можете использовать предоставленный пользователем номер. Вместо этого используйте большое постоянное число (например, 64). Вам нужно другое целое число, которое будет ограничивать свой вывод:

int x_temp = 10; 
cin >> x_temp; 
int const bits = 64; 
... 

Здесь 64 является своего рода максимального значения можно использовать, потому что bitset имеет конструктор с unsigned long long аргументом, который имеет 64 бит (по крайней мере, может быть Больше).

Однако, если вы используете int для промежуточных вычислений, ваш код поддерживает максимально 14 бит надёжно (без переполнения). Если вы хотите поддерживать более 14 бит (например, 64), используйте больший тип, например uint32_t или uint64_t.

Проблема с удержанием большего количества бит, чем требуется, заключается в том, что будут отображаться дополнительные биты. Для того, чтобы вырезать их, используйте substr:

cout << bitset<64>(...).to_string().substr(64 - x_temp); 

Здесь to_string преобразует его в строку 64 символов, и substr режет последние символы, число которых x_temp.

+0

Спасибо, я думаю, я понимаю, но можете ли вы сказать мне, как я могу ограничить свой вывод, когда дело доходит до ведущих 0s? – januszysko

+0

Значит, вы не хотите отображать ведущие нули? Возможно, вы захотите задать другой вопрос для этого (если вы сами это не выясните). – anatolyg

+0

Я имею в виду, что я делаю, но только для ограниченной стоимости. Я не хочу показывать число на 64 битах, но на 10, например – januszysko

0

Вы должны определить const int bits = 10; в качестве глобальной константы:

#include <iostream> 
#include <math.h> 
#include <bitset> 

using namespace std; 
const unsigned bits=10; 
int main() { 
    int maximum_value = 0,x_temp=10; 

    for (int i = 1; i <= bits; i++) { 
     maximum_value += pow(2, bits - i); 
    } 
    for (int i = maximum_value; i >= 0; i--) 
     cout << bitset<bits>(maximum_value - i) << endl; 
    return 0; 
} 

enter image description here

+0

Это не проблема. Я хочу иметь возможность набирать количество бит на моей клавиатуре. – januszysko

+0

Аргумент шаблона должен быть определен перед компиляцией. – Abel

Смежные вопросы