LINUX.ORG.RU

История изменений

Исправление sambist, (текущая версия) :

Сишечка не работает

#include <stdio.h>
#include <stdint.h>

#define BYTE(a7, a6, a5, a4, a3, a2, a1, a0) ((a7 << 7) | (a6 << 6) | (a5 << 5) | (a4 << 4) | (a3 << 3) | (a2 << 2) | (a1 << 1) | (a0))
#define BIT(a, num) ( ((a) & ( 0x1 << (num) )) != 0 )

int main(void)
{
   typedef union 
   {
      uint8_t u;
      int8_t  i;
   } conv;

    conv aR;
    conv bR;

   int8_t a = 8;
   int8_t b = -21;
   
    aR.i = a;
    bR.i = b;
   
   // -168

   uint8_t p0 = BYTE(BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0)) & bR.u;
   uint8_t p1 = BYTE(BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1)) & bR.u;
   uint8_t p2 = BYTE(BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2)) & bR.u;
   uint8_t p3 = BYTE(BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3)) & bR.u;
   uint8_t p4 = BYTE(BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4)) & bR.u;
   uint8_t p5 = BYTE(BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5)) & bR.u;
   uint8_t p6 = BYTE(BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6)) & bR.u;
   uint8_t p7 = BYTE(BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7)) & bR.u;
   
   uint8_t r = BYTE(BIT(aR.u,7) ^ BIT(bR.u,7),
                    BIT(p6,0) | BIT(p5,1) | BIT(p4,2) | BIT(p3,4) | BIT(p2,4) | BIT(p1,5) | BIT(p0,6),
                    BIT(p5,0) | BIT(p4,1) | BIT(p3,2) | BIT(p2,3) | BIT(p1,4) | BIT(p0,5),
                    BIT(p4,0) | BIT(p3,1) | BIT(p2,2) | BIT(p1,3) | BIT(p0,4),
                    BIT(p3,0) | BIT(p2,1) | BIT(p1,2) | BIT(p0,3),
                    BIT(p2,0) | BIT(p1,1) | BIT(p0,2),
                    BIT(p1,0) | BIT(p0,1),
                    BIT(p0,0));
                    
   
   conv cR;
   
   cR.u = r;
   
   printf("%d\n", cR.i); // -127
}

Исходная версия sambist, :

Сишечка не работает

#include <stdio.h>
#include <stdint.h>

#define BYTE(a7, a6, a5, a4, a3, a2, a1, a0) ((a7 << 7) | (a6 << 6) | (a5 << 5) | (a4 << 4) | (a3 << 3) | (a2 << 2) | (a1 << 1) | (a0))
#define BIT(a, num) ( ((a) & ( 0x1 << (num) )) != 0 )

int main(void)
{
   typedef union 
   {
      uint8_t u;
      int8_t  i;
   } conv;

    conv aR;
    conv bR;

   int8_t a = 8;
   int8_t b = -21;
   
    aR.i = a;
    bR.i = b;
   
   // -168

   uint8_t p0 = BYTE(BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0), BIT(aR.u, 0)) & bR.u;
   uint8_t p1 = BYTE(BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1), BIT(aR.u, 1)) & bR.u;
   uint8_t p2 = BYTE(BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2), BIT(aR.u, 2)) & bR.u;
   uint8_t p3 = BYTE(BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3), BIT(aR.u, 3)) & bR.u;
   uint8_t p4 = BYTE(BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4), BIT(aR.u, 4)) & bR.u;
   uint8_t p5 = BYTE(BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5), BIT(aR.u, 5)) & bR.u;
   uint8_t p6 = BYTE(BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6), BIT(aR.u, 6)) & bR.u;
   uint8_t p7 = BYTE(BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7), BIT(aR.u, 7)) & bR.u;
   
   uint8_t r = BYTE(BIT(aR.u,7) ^ BIT(bR.u,7),
                    BIT(p6,0) | BIT(p5,1) | BIT(p4,2) | BIT(p3,4) | BIT(p2,4) | BIT(p1,5) | BIT(p0,6),
                    BIT(p5,0) | BIT(p4,1) | BIT(p3,2) | BIT(p2,3) | BIT(p1,4) | BIT(p0,5),
                    BIT(p4,0) | BIT(p3,1) | BIT(p2,2) | BIT(p1,3) | BIT(p0,4),
                    BIT(p3,0) | BIT(p2,1) | BIT(p1,2) | BIT(p0,3),
                    BIT(p2,0) | BIT(p1,1) | BIT(p0,2),
                    BIT(p1,0) | BIT(p0,1),
                    BIT(p0,0));
                    
   
   conv cR;
   
   cR.u = r;
   
   printf("%d\n", cR.i);
}