Я хочу ограничить минимальное значение, которое пользователь может ввести в максимальный размер потока минус бит более высокого порядка, чтобы предотвратить переполнение. Это было бы легко, если бы я жестко закодировал размеры бит, но я хотел бы использовать систему пользователей и сделать ее более динамичной. Итак, как я могу вычесть наивысший бит из максимальной длины потока?
Вот что я имею до сих пор:
// Get a decimal number from user and validate number entered
while((cout << "Enter decimal number: ") && !(cin >> number)){
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input. Try again\n";
}
Я думаю, мне нужно добавить еще один тест для значения min, как это:
while((cout << endl << "Enter decimal number: ") && !(cin >> number) && !(number >= -numeric_limits<streamsize>::max())){
Но как-то вычтите бит наивысшего порядка из numeric_limits<streamsize>::max()
В моем случае это будет 31-й бит, но может отличаться для кого-то на другой машине.
Спасибо за помощь.
Если вы хотите очистить бит наивысшего порядка от любого интегрального типа, вы можете использовать такую функцию:
#include <type_traits>
template<class T>
T clearHighestBit(T val) {
typedef typename std::make_unsigned<T>::type uT;
uT unsignedVal = val;
if(!val)
return 0;
uT pos = 1;
while(unsignedVal >>= 1)
pos <<= 1;
return val & ~pos;
}
Все это - найти бит наивысшего порядка, создает неподписанную версию T и not-ands с исходным номером (то есть принимает все биты, которые не являются самыми высокими)
Надеюсь, это поможет,
Ура!