Задать вопрос
@Urukhayy

Сколько весит булевая переменная в си подобных языках?

Она ведь 4 байта весит? Но зачем 4 байта для значения true or false? Там и бита хватит. Тогда следующий вопрос, как можно в обычной переменной изменить значение третьего бита или получить его значение? Какие функции? C++.
  • Вопрос задан
  • 2575 просмотров
Подписаться 2 Оценить 1 комментарий
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
toster.ru/answer?answer_id=396975

как можно в обычной переменной изменить значение третьего бита или получить его значение

int v = 8;
int v3 = (v >> 3) & 1; // получил значение третьего бита (0/1)

v ^= (1 << 3); // инвертировал третий бит
v |= (1 << 3); // установил третий бит
v &= ~(1 << 3); // сбросил третий бит
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@DancingOnWater
Побитовые операции смотреть.
А еще битовые поля.

Вот так, к примеру, можно получить третий бит (написал из головы, за полную корректность не отвечаю)
uint x = 10;
int value = (x & 0x8) >>2;

P.S. А 4 весит из-за того, что все типы в Си пляшут от 4-битового char. Но никто не мешает объявить структуру шириной в 1 бит, но тогда самому придется встретиться с выравниванием.
Ответ написан
Комментировать
@brutal_lobster
Загляните в стандарт по с++, например: 5.3.3 Sizeof
The result of sizeof applied to any other fundamental type (3.9.1) is
implementation-defined. [ Note: in particular, sizeof(bool), sizeof(char16_t), sizeof(char32_t), and
sizeof(wchar_t) are implementation-defined
Ответ написан
Комментировать
@algol
Не знаю как правильно называется, но...
codepad.org/zUOeXQBj

#include <stdio.h>
struct  __attribute__ ((__packed__)) A {
unsigned flag0 : 1;
unsigned flag1 : 2;
unsigned flag2 : 2;
unsigned flag3 : 3;
};
int main() {
A a = {1, 0, 2, 7};
printf("%d\n", sizeof(bool)); // 1
printf("%d\n", sizeof(A)); // 1
printf("%u %u %u %u\n", a.flag0, a.flag1, a.flag2, a.flag3); // 1 0 2 7
return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы