На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (76) « Первая ... 74 75 [76]   ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    Тут то можно, а вот как в:
    ExpandedWrap disabled
      if( a&64 )
    ? Битами было бы просто: "if( a.7 )", а сдвигами придётся ж скобки мутить!? :scratch:

    Добавлено
    Я конечно понимаю, что несколько нечестно выдумываю примеры, но вот так и тянет-с: "если (первый, третий, пятый и седьмой биты равны), или (4-ый и 6-й равны нулю, а второй да восьмой равны 1) то":
    ExpandedWrap disabled
      if( (a.1==a.3 && a.1==a.5 && a.1==a.7) || (a.4==a.6 && a.4==0 && a.2==a.8 && a.2==0) )
    На прямом способе получим-с...:
    ExpandedWrap disabled
      if( (!((a&(1|4|16|64))^(1|4|16|64)) || !(a&(1|4|16|64))) || (!((a&(2|128))^(2|128)) && !(a&(8|32))) )
    Надеюсь, что можно написать и проще, но так уж мысля пошла... :blush:

    Добавлено
    Пардон, в первой строке в хвосте 1 надо:
    ExpandedWrap disabled
      if( (a.1==a.3 && a.1==a.5 && a.1==a.7) || (a.4==a.6 && a.4==0 && a.2==a.8 && a.2==1) )


    Добавлено
    Как всё это будет выглядеть со сдвигами единицы даже думать (страшно|не хочется).
      Цитата Славян @
      Битами было бы просто: "if( a.7 ), а сдвигами придётся ж скобки мутить!?
      ExpandedWrap disabled
        if(a & (1 << 7))

      Цитата Славян @
      Я конечно понимаю, что несколько нечестно выдумываю примеры, но вот так и тянет-с: "если (первый, третий, пятый и седьмой биты равны),
      Ну вот разве что "если биты равны между собой". Но этот пример реально выдуманный, за 28-летнюю практику программирования микроконтроллеров (низкоуровнее некуда) хорошо если пару раз была необходимость сравнивать биты между собой, да и в те разы таких битов было всего два, поэтому можно было записать
      ExpandedWrap disabled
        if(!!(a & (1 << 1)) == !!(a & (1 << 5)))


      Ваш пример, соответственно, решается так:
      ExpandedWrap disabled
        if( false
          || (!!(a & (1 << 1)) == !!(a & (1 << 3)) == !!(a & (1 << 5)) == !!(a & (1 << 7)))
          || ( true
             && !(a & (1 << 4))
             && !(a & (1 << 6))
             && (a & (1 << 2))
             && (a & (1 << 8))
             )
          )
      Все-таки читаемее вашего


      Но если отвлечься от придуманных примеров - то в реальных задачах каждый бит отвечает за конкретную сущность и надо именовать его этой сущностью, а не оперировать некими "магическими" числами (неважно - номерами бита или битовыми масками) и тут битовые поля вполне себе с задачей справляются:
      ExpandedWrap disabled
            union shift_reg_pinout
            {
                struct
                {
                    uint8_t AC_out1_red     : 1;
                    uint8_t AC_out4_green   : 1;
                    uint8_t AC_out4_red     : 1;
                    uint8_t AC_out3_green   : 1;
                    uint8_t AC_out3_red     : 1;
                    uint8_t AC_out2_green   : 1;
                    uint8_t AC_out2_red     : 1;
                    uint8_t AC_out1_green   : 1;
         
                    uint8_t AC_out5_red     : 1;
                    uint8_t AC_in2_green    : 1;
                    uint8_t AC_in2_red      : 1;
                    uint8_t AC_in1_green    : 1;
                    uint8_t AC_in1_red      : 1;
                    uint8_t AC_out6_green   : 1;
                    uint8_t AC_out6_red     : 1;
                    uint8_t AC_out5_green   : 1;
                };
                uint16_t Raw;
            } __attribute__((packed));


      А ваше желание реализуется таким же битовым полем с именами членов "_0", "_1", "_2" и т.д.
      Сообщение отредактировано: Dushevny -
        Только в вашем первом коде надо поправить на 6, ибо 1<<n=2n, поэтому 1<<7 = 128.
          Цитата Славян @
          Только в вашем первом коде надо поправить на 6, ибо 1<<n=2n, поэтому 1<<7 = 128.
          Вы хотели проверять седьмой бит. Я его и проверил. Или вы биты считаете не с нуля, а с единицы? Тогда и все остальные надо поправлять, я привык биты считать с нуля и да, 1<<7 это 128, а 1 << 0 - это 1.
          Сообщение отредактировано: Dushevny -
            Цитата Dushevny @
            Или вы биты считаете не с нуля, а с единицы?
            Ну в том конкретном пожелании я написал "a&64", что указывает на необходимость сдвига на 6. И запись вида a.0 несколько режет глаз, поэтому думается, что лучше бы было пользоваться видом a.1 - a.8. Вот если бы они индексировались (этап 2 :) ), как предлагал qraizer (a.i), то тогда выгоднее вести запись их с нуля. Но индексация выглядит сильно коряво, посему я о ней даже не думаю...
              Цитата Славян @
              Ну в том конкретном пожелании я написал "a&64", что указывает на необходимость сдвига на 6
              А, вы про тот пример? Так там я на 6 и сдвигал:
              Цитата Dushevny @
              Таким школьникам бью по рукам линейкой и заставляю сто раз писать на доске a |= 1 << 6.
              Все, теперь понял. Я не обратил внимания на текст в блоке кода (лучше всего спрятанное лежит на самом видном месте) и начал отвечать на "if(a.7)", полагая, что вы имели ввиду седьмой бит считая с нуля. Все, мир.
              Цитата Славян @
              И запись вида a.0 несколько режет глаз, поэтому думается, что лучше бы было пользоваться видом a.1 - a.8
              В любой документации биты нумеруются с нуля. Получается, тут все идут не в ногу и только вы один - в ногу :)
              Сообщение отредактировано: Dushevny -
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:
              Страницы: (76) « Первая ... 74 75 [76] 


              Рейтинг@Mail.ru
              [ Script execution time: 0,1035 ]   [ 17 queries used ]   [ Generated: 9.12.22, 22:39 GMT ]