Няшная / Говнокод #28289 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 3.14159265, (Updated )

Комментарии (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
      Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8