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";
}

我想我需要为最小值添加另一个测试,如下所示:

while((cout << endl << "Enter decimal number: ") && !(cin >> number) && !(number >= -numeric_limits<streamsize>::max())){

但是以某种方式减去最高位numeric_limits<streamsize>::max()

在我的情况下,这将是第 31 位,但对于不同机器上的人来说可能会有所不同。

谢谢您的帮助。

4

1 回答 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 并与原始数字不与它(也就是说,它接受所有不是最高的位)

希望有帮助,

干杯!

于 2013-10-14T02:11:07.837 回答