Как ограничить пользовательское минимальное значение размером потока менее одного бита?

0

Я хочу ограничить минимальное значение, которое пользователь может ввести в максимальный размер потока минус бит более высокого порядка, чтобы предотвратить переполнение. Это было бы легко, если бы я жестко закодировал размеры бит, но я хотел бы использовать систему пользователей и сделать ее более динамичной. Итак, как я могу вычесть наивысший бит из максимальной длины потока?

Вот что я имею до сих пор:

// 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-й бит, но может отличаться для кого-то на другой машине.

Спасибо за помощь.

Теги:

1 ответ

0
Лучший ответ

Если вы хотите очистить бит наивысшего порядка от любого интегрального типа, вы можете использовать такую функцию:

#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 с исходным номером (то есть принимает все биты, которые не являются самыми высокими)

Надеюсь, это поможет,

Ура!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню