Почему bool не меняется при побитовых операциях? C++
В C++ bool весит 1 байт. Я решил для изучения побитовых операций сделать программу, которая позволит хранить 8 значений True/False в одном bool (Практической пользы это не несет, это только для тренировки). И наткнулся на интересное поведение. Сначала приведу код:
#include <iostream>
using namespace std;
void setBool(bool &bb, int bit, bool setter) {
bit--; // 1
if (setter) { // true
cout << "1: " << (bb | (1 << bit)) << "\n"; // Выводит 3, все верно
bb |= (1 << bit); // 0000 0001 | 0000 0010 = 0000 0011
}
else {
bb &= ~(1 << bit);
}
}
int main() {
bool bb = true; // 0000 0001
setBool(bb, 2, true); // bb = 0000 0011
cout << "2: " << bb << "\n"; // Выводит 1 !!
system("pause");
return 0;
}
При вызове функции и передаче ей переменной проверяется, хочу я установить 1 или 0 и в какой байт. Далее выбирается этот байт и если я хочу вставить 1, то выполняется побитовое "И" переменной с единицей, побитово сдвинутой влево на нужное число бит. И здесь начинается прикол. Если запихнуть Выражение (bb | (1 << bit)) в std::cout, то выведет закономерно 3. Однако после этого, если вывести саму переменную bb в консоль, то выведет 1. Почему?
Ответы (1 шт):
Потому что это же не int и не unsigned char, а bool.
Абелева переменная принимает два значения - false или true. Все, что не 0, превращается в true, а выводится как 1 - пока не зададите формат boolalpha.
Работайте с unsigned char. Хранить в bool - пусть оно и реализовано как unsigned char - 8 значений - некорректно. Кстати, компилятор при включенных предупреждениях должен был об этом сообщить.