Почему эта программа показывает следующий вывод?
#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';
}
Это ВЫХОД:
01000000
11000111
b1 & b2: 01000000
b1 | b2: 11000111
b1 ^ b2: 10000111
Сначала я подумал, что с заголовочным файлом что-то не так (я использовал MinGW), поэтому я
проверено с помощью MSVCC. Но это тоже показало то же самое. Пожалуйста помоги.
Несмотря на внешний вид, 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"));
Согласно ответу 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;
}
кликните сюда просмотреть вывод.