Обратные биты в целое число: исключение stoi - PullRequest
0 голосов
/ 14 июля 2020

Я выхожу за пределы допустимого диапазона при использовании stoi. Я пытаюсь перевернуть биты целого числа, сначала помещая биты в строку, а затем преобразовывая эту строку в целое число с помощью stoi.

uint32_t reverseBits(uint32_t n) {
    string nu_bits;
    for(int i=0; i<32;i++){
       // cout<<((n>>i)&1);
       nu_bits.push_back(((n>>i)&1)+'0');
    }
    cout<<endl;
    cout<<stoi(nu_bits);
    return n;
}

terminate вызывается после выброса экземпляра 'std :: out_of_range' what (): стои

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

По умолчанию std::stoi() ожидает строку в формате base10 (десятичный). Но вместо этого вы передаете ему строку в формате base2 (двоичный). Когда эта строка base2 интерпретируется в base10, если результат превысит границы int, тогда будет выбрано исключение std::out_of_range:

Исключения

  • std::invalid_argument, если преобразование не может быть выполнено

  • std::out_of_range, если преобразованное значение выпадет за пределы диапазона типа результата или если базовая функция (std::strtol или std::strtoll) устанавливает errno в ERANGE.

std::stoi() имеет необязательный параметр base , который вы можете установить на 2 для двоичного, например:

cout << stoi(nu_bits, nullptr, 2);
2 голосов
/ 14 июля 2020

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

uint32_t reverseBits(uint32_t n) {
    uint32_t r = 0;
    for( int sh = 1; n; n >>= 1 ) 
        r |= (n & 1) << (32 - sh++);
    return r;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...