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 に答える