Упаковка битов в байт

Тема в разделе "Микроконтроллеры AVR", создана пользователем Yerabdi, 24 окт 2020.

  1. SergeiL

    SergeiL Оракул Модератор

    Не, мне нравится, интересно. :)
    Так это известно, многие этим пользуемся лет так - 30, под Windows - 20.
    Нужно же как то развиваться. :)
     
  2. SergeiL

    SergeiL Оракул Модератор

    Все работает на ESP, Спасибо!
    sizeof() был 4, стал равен 3 после установки #pragma pack на 1.

    Да уж, подкинули тему, разбираюсь потихоньку в отпуске, между прогулками по Крыму.
    Си->С++ конечно эволюционировал за то время пока я был далек от этого...
     
  3. Asper Daffy

    Asper Daffy Иксперд

    Ну, да, для 32-битного процессора, обычно умолчание не 1.

    Удачи!
     
  4. SergeiL

    SergeiL Оракул Модератор

    Спасибо за пример, разобрался с примером до деталей - очень прикольно!!!
    Пока закомментировал структуру, иначе обязательно нужно правильно указывать (расписывать) количество элементов в структуре, иначе размер "битового массива" выбирается по тому что больше в union, указанному размеру битового массива с округление до большего или кол-ву эл. в структуре. Не знаю, может это можно как то обойти.
    В 1990-ых С++ как то не зашел, может доки не те были, может на Си можно было все сделать. Сейчас вечерами читаю - многое разъясняется.
    В 1997 перешел на абсолютно другую работу, и Си и МК, остались как личные интересы.
     
    Последнее редактирование: 11 ноя 2020
  5. incbot

    incbot Нуб

    Доброго дня Вам, уважаемый Asper Daffy. Смотрю на фрагмент вашего кода. Идея полностью понятна, но есть большое но... Всю свою сознательную жизнь программировал на чистом Си без плюсов. По сему все обьектно ориентированное вызывает затруднения. Особенно это касается operator. Не могли бы вы подробно расписать что , зачем и почему (если еще и с обьяснением синтаксиса то будет прямо вообще 5++) в строчках ниже (понятно пока только возвращаемые значения в фигурных скобках):

    operator bool(void) { return static_cast<bool> (bt & mask); }
    bool operator = (const bool b) { return (bt = b ? bt | mask : bt & ~mask); }
    bool operator = (CunningBool & other) { return static_cast<bool>(*this = static_cast<bool>(other)); }

    Также чуть ниже:

    CunningBool operator [] (const int n) { return CunningBool (anArray[n / 8], 1 << (n % 8)); }
     
  6. Asper Daffy

    Asper Daffy Иксперд

    Ну, записывая структуру, Вы ведь определяете новый тип, правильно? В этом языке для своих типов можно определить стандартные операции типа + -, преобразования к другому типу, взятие указателя, взятие элемента по индексу, присваивание и т.п.

    Все перечисленные операторы определяют что делать, если с переменной описанной как "наш тип" будут что-то делать:

    operator bool(void) { ... - что делать, если её нужно преобразовать к bool
    bool operator = (const bool b) { - что делать, если её будут присваивать значение типа bool
    bool operator = (CunningBool & other) { - что делать, если ей будут присваивать значение типа CunningBool
    CunningBool operator [] (const int n) { - что делать, если от нашей переменной будут брать элемент по индексу.

    На эту тему до хрена написано, например
    https://habr.com/ru/post/489666/
    https://habr.com/ru/post/132014/
    https://prog-cpp.ru/cpp-operator/
    http://ermak.cs.nstu.ru/cprog/html/103.htm
     
    SergeiL нравится это.
  7. incbot

    incbot Нуб

    Большое спасибо. Я к моменту как ответили уже почитал )) Ссылки ваши тоже гляну сейчас. Синтаксис просто не привычный после Си ... Ну и по operator bool(void) оставались непонятки. Можно еще спрошу по теме "около" ? У меня компилятор для stm32 не поддерживает тип bool. Т.е. конечно можно использовать uint8_t или например uchar... А вопрос соответственно такой. Как грамотно делать приведение типов к bool, чтобы после приведения было 0/1 в байте? Ну например , делаю побитовое "И". В результате получаю единичку в каком то бите байта. Казалось бы не ноль, те true. Но не всегда это хорошо. Пока в голову приходит только что то типа var= (1 && (abc & 1<<sdvig)) , либо var=(abc & 1<<sdvig) ? 1; 0, что из этого будет побыстрее или может есть другие интереснее решения?
     
    Последнее редактирование: 2 мар 2021
  8. Asper Daffy

    Asper Daffy Иксперд

    Хрена-се. В С++? Или таки в С? Если в С, то и не должен, там это _Bool называется (иногда надо stdbool.h включать). А в С++ обязан поддерживать, этот тип входит в стандарт языка.
    Что-то типа
    Код (C++):
    var = !!abc;
     
  9. parovoZZ

    parovoZZ Гуру

    я сам себе делаю bool. Но это больше для наглядности.
     
  10. b707

    b707 Гуру

    Больно?
     
  11. parovoZZ

    parovoZZ Гуру

    Не так больно, как страшно.
     
  12. incbot

    incbot Нуб

    Там как то интересно выходит. Я начинал писать на чистом Си. Потом в конфигурационном файле для среды Atollic True Studio подключил Си++. Все что обьектовое теперь понимается нормально... Кстати смешно и грустно, но _Bool тоже нет. Может чего подключить надо? В каких .h посмотреть? Stdbool. h поищу к ночи ближе
     
  13. Asper Daffy

    Asper Daffy Иксперд

    Посмотрите
     
  14. SergeiL

    SergeiL Оракул Модератор

    Блин, сразу и не понял, что это два раза "логическое НЕ". Действительно - просто и понятно.
    Полез искать оператор "!!" :)

    Стало интересно, сравнил разницу в коде между
    Код (C++):
    var = !!abc;
    и
    Код (C++):
    var = (abc)?1:0;
    Одинаково, вплоть до команды!