Двоичное смещение int невозможно - PullRequest
2 голосов
/ 20 марта 2011
usigned int val = 1;
val <<= 30; 
cout << intToBin(val) << endl;

string intToBin(unsigned int val) {
    unsigned int k=1;
    string ret;
    while (k <= val) {
        if (k & val) {
            ret.insert(0,"1");
        } else {
            ret.insert(0,"0");
        }
        k <<= 1;
    }
    return ret;
}

Это напишет 1 и 30x 0, что в порядке. Но мне нужно иметь 1 на старшем бите, то есть на первой позиции, за которой следуют 31 ноль. Но когда я пытаюсь val << = 31; ничего не написано, чего я не понимаю. Не могли бы вы уточнить это для меня, пожалуйста? </p>

Спасибо

1 Ответ

5 голосов
/ 20 марта 2011

Ваш цикл while не прекратится, если val равно >= 2^31.

Это потому, что k == 2^31 по-прежнему <= val, но 2^31 << 1 == 2^32 переполняется и становится равным 0. Что по-прежнемуменьше, чем предел.

Вы можете продлить условие, чтобы нарушить его, если тоже k == 0, тогда проблема должна исчезнуть.

(^ означает возведение в степень, а не xor в этом посте)

...