Почему переменная std:: bitset <8> не может обрабатывать 11111111? - программирование
Подтвердить что ты не робот

Почему переменная std:: bitset <8> не может обрабатывать 11111111?

Почему эта программа показывает следующий результат?

#include <bitset>
...

{
    std::bitset<8> b1(01100100); std::cout<<b1<<std::endl;
    std::bitset<8> b2(11111111); std::cout<<b2<<std::endl; //see, this variable
                                                           //has been assigned
                                                           //the value 11111111
                                                           //whereas, during
                                                           //execution, it takes
                                                           //the value 11000111
    std::cout << "b1 & b2: " << (b1 & b2) << '\n';
    std::cout << "b1 | b2: " << (b1 | b2) << '\n';
    std::cout << "b1 ^ b2: " << (b1 ^ b2) << '\n';
}

Это OUTPUT:

01000000
11000111
b1 & b2: 01000000
b1 | b2: 11000111
b1 ^ b2: 10000111

Во-первых, я думал, что что-то не так с файлом заголовка (я использовал MinGW), поэтому я проверен с использованием MSVCC. Но это тоже показало то же самое. Пожалуйста, помогите.

4b9b3361

Ответ 1

Несмотря на внешний вид, 11111111 является десятичным. Бинарное представление 11111111 10 равно 101010011000101011000111 2. При построении std::bitset<8> принимает восемь наименее значимых бит: 11000111 2.

Первый случай аналогичен, за исключением того, что 01100100 является восьмеричным (из-за начального нуля). То же самое число, выраженное в двоичном выражении, 1001000000001000000 2.

Один из способов представления битового набора со значением 11111111 2 - std::bitset<8> b1(0xff).

В качестве альтернативы вы можете построить битовый набор из двоичной строки:

std::bitset<8> b1(std::string("01100100"));
std::bitset<8> b2(std::string("11111111"));

Ответ 2

В соответствии с ответом NPE вы создаете bitset с unsigned long, а не с битами, как вы ожидали. Альтернативный способ его создания, который позволяет вам указывать биты, заключается в использовании конструктора string следующим образом:

#include <bitset>
#include <cstdio>
#include <iostream>

int main()
{
    std::bitset<8> b1(std::string("01100100")); std::cout<<b1<<std::endl;
    std::bitset<8> b2(std::string("11111111")); std::cout<<b2<<std::endl;
    std::cout << "b1 & b2: " << (b1 & b2) << '\n';
    std::cout << "b1 | b2: " << (b1 | b2) << '\n';
    std::cout << "b1 ^ b2: " << (b1 ^ b2) << '\n';
getchar();
return 0;
}

Нажмите здесь, чтобы просмотреть результат.