#c #macos
Вопрос:
Я хочу проверить, что такое переменная «num» от 0 до 15, Как я могу проверить, является ли это одним из этих чисел и какое число у меня есть до сих пор.
#include <iostream>
using namespace std;
int num = 0;
int main()
{
cout << "Number to check:";
cin >> num;
{
if num = 0;
cout << "0000";
{
if num = 2;
cout << "0010";
{
if num = 1;
cout << "0001";
{
if num = 3;
cout << "0011";
{
if num = 4;
cout << "0100";
{
if num = 7;
cout << "0111";
{
if num = 5;
cout << "0101";
{
if num = 6;
cout << "0110";
{
if num = 8;
cout << "1000";
{
if num = 9;
cout << "1001";
{
if num = 10;
cout << "1010";
{
if num = 11;
cout << "1011";
{
if num = 12;
cout << "1100";
{
if num = 13;
cout << "1101";
{
if num = 14;
cout << "1110";
{
if num = 15;
cout << "1111";
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
return 0;
Как я могу это сделать, если я не могу, как я могу преобразовать число в 4-разрядный двоичный байт? И, если возможно, как я могу убедиться, что введенное число находится в диапазоне от 0 до 15 и что во введенной строке нет букв
Комментарии:
1. Вы скомпилировали свой код? Вы можете проверить, находится ли входное число в диапазоне от 0 до 15, используя простое
if
Ответ №1:
Приведенная ниже программа делает то, что вы хотите.
#include<iostream>
#include <bitset>
int main() {
int num = 0;
std::cout << "Number to check: ";
std::cin >> num;
while (std::cin.fail() || num > 15 || num < 0) {
std::cout << "Error! Invalid Input n";
std::cin.clear();
std::cin.ignore(256, 'n');
std::cout << "Number to check: ";
std::cin >> num;
}
std::bitset<4> value;
value = { static_cast<unsigned long>(num) };
std::cout << value.to_string() << "n";
return 0;
}
Комментарии:
1. Почему у вас есть переключатель из пятнадцати одинаковых ящиков?
2. Это не столько неэффективно (за исключением напрасной работы по копированию и вставке), сколько бессмысленно.
std::bitset<4> value { static_cast<unsigned long>(num) }; std::cout << value.to_string() << "n";
этого достаточно.3.@east1000 выглядит немного безумно. Вы можете просто
value = static_cast<unsigned long>(num); std::cout << value.to_string() << "n";
ОДИН РАЗ, так как вы уже знаетеnum
, что это от 0 до 154. @molbdnilo точно мои мысли 😉
5. Хех, нет, совсем нет! Никакой ревности здесь, я имел в виду дублирование, а не набор бит
Ответ №2:
Используйте <набор битов>
#include <bitset>
#include <iostream>
#include <string>
int main()
{
std::string input{ "12" };
// std::cin >> input;
unsigned long number = std::stoul(input); // does number checking
if (number < 16) // do value checking
{
std::bitset<4> value{ number };
std::cout << value.to_string() << std::endl;
}
}
Ответ №3:
Поскольку вы объявили num
как целое число, ваша программа не будет работать, если во время ввода вы введете неигровые символы cin
. Я считаю, что самый короткий вариант вашего кода без обработки std::bitset
был бы
const int MAX_BITS = 4;
cout << "Number to check:";
cin >> num;
if (num < 0 || num > (1 << MAX_BITS) - 1) {
cout << "Invalid number, next time enter between 0 and " << (1 << MAX_BITS) - 1;
return 0;
}
for(int bit = MAX_BITS - 1; bit >= 0; --bit){
cout << ((num amp; (1 << bit)) > 0);
}
cout << endl;
Комментарии:
1. Зачем изобретать велосипед, если вы можете использовать стандартную библиотеку?
2. @PKramer Я не утверждаю, что сделал бы это при наличии стандартного подхода. Я просто даю вариант, который требует только операций из первых глав книг по C
3. Достаточно справедливо 😉 Хотя я думаю, что большинство книг на C тоже требуют обновления, научите STL, прежде чем «как писать свои собственные структуры данных с помощью указателей».