1. Си / Говнокод #28289

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    #define BITS 8
    
    typedef union
    {
        int v;
        struct 
        {
            #define FIELD(x,_) int b##x:1;        
            EVAL(REPEAT(BITS, FIELD, ~))
            #undef FIELD
        };
    } Num;
    
    Num shl(Num n, int carry)
    {
        #define SHIFTL(x,_) CAT(n.b, CAT(x = n.b, CAT(DEC_,x)));    
        EVAL(RREPEAT(BITS, SHIFTL, ~))
        #undef SHIFTL
        n.b0 = carry;
    }
    
    Num shr(Num n, int carry)
    {
        #define SHIFTR(x,_) CAT(n.b, CAT(CAT(DEC_,x) = n.b, x));
        EVAL(REPEAT(BITS, SHIFTR, ~))
        #undef SHIFTR
        CAT(n.b, CAT(DEC_,BITS)) = carry;
    }
    
    
    int main()
    {
        for (int i=0; i<33; ++i){
            Num n   = {i};
            Num n1 = shl(n,0);
            Num n2 = shr(n,0);        
            printf("%d %d %d\n",n ,n1 , n2);
        }
    }

    https://godbolt.org/z/48h6EWacY

    Двунаправленный сдвиговый регистр на препроцессоре.
    Сделан без использования арифметических действий.

    Запостил: 3.14159265, 21 Июля 2022

    Комментарии (6) RSS

    • Здесь https://govnokod.ru/23832#comment781092 я упёрся в то, что полноценная реализация инкрементирующего сумматора не работает без сдвига.

      Имея сложение это тривиально: a+a. Но мы пытаемся реализовать саму операцию сложения.
      А реализовать сам сдвиг на самых тривиальных побитовых операциях нельзя, поскольку они не меняют положение битов.

      Так же не подходят всякие способы обхода циклом, т.к. в нём тоже есть операция инкремента.
      for (int i=0; i<8; ++i){
      Ответить
    • Дампик Выхлоп прецпроцессора:
      typedef union
      {
          int v;
          struct
          {
      
              int b0:1; int b1:1; int b2:1; int b3:1; int b4:1; int b5:1; int b6:1; int b7:1;
      
          };
      } Num;
      
      Num shl(Num n, int carry)
      {
      
          n.b7 = n.b6; n.b6 = n.b5; n.b5 = n.b4; n.b4 = n.b3; n.b3 = n.b2; n.b2 = n.b1; n.b1 = n.b0; n.b0 = n.b0;
      
          n.b0 = carry;
      }
      
      Num shr(Num n, int carry)
      {
      
          n.b0 = n.b0; n.b0 = n.b1; n.b1 = n.b2; n.b2 = n.b3; n.b3 = n.b4; n.b4 = n.b5; n.b5 = n.b6; n.b6 = n.b7;
      
          n.b7 = carry;
      }
      
      int main()
      {
          for (int i=0; i<33; ++i){
              Num n = {i};
              Num n1 = shl(n,0);
              Num n2 = shr(n,0);
              printf("%d %d %d\n",n ,n1 , n2);
          }
      }
      Ответить
    • А дампик где?
      Ответить
      • Самое смешное что после добавления
        #pragma pack(push,1) и гетигп н

        Легким движением компилятора макрусня превращается... превращается макрусня ... макрусня превращается...

        В элегантные шифты!

        shl:                                    # @shl
                lea     eax, [rdi + rdi]
                and     sil, 1
                or      al, sil
                ret
        shr:                                    # @shr
                shr     dil
                shl     sil, 7
                lea     eax, [rsi + rdi]
                ret


        Шланг: https://godbolt.org/z/dMah4erfs

        А вот гцц обосрался:
        https://godbolt.org/z/qafnPYeT1
        Ответить
    • Для BITS 16 ещё красивее
      https://godbolt.org/z/EasbMjffP
      
      shl:                                    # @shl
              and     esi, 1
              lea     eax, [rsi + 2*rdi]
              ret
      shr:                                    # @shr
              mov     eax, esi
              shld    ax, di, 15
              ret
      Ответить
    • (захлопал крыльями)
      Ответить

    Добавить комментарий