Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // author: r57shell@uralweb.ru
- #include <cstdio>
- // standard add carry flag calculation
- bool add_c(int a, int b)
- {
- if ((unsigned int)a > 0xF || (unsigned int)b > 0xF)
- printf("Assertation failed!\n");
- int r = a + b;
- return ((a&0x8)&b)|(((~r)&0x8)&b)|(((~r)&0x8)&a);
- }
- // if you don't belive to previous function, use this
- bool add_c1(int a, int b)
- {
- if ((unsigned int)a > 0xF || (unsigned int)b > 0xF)
- printf("Assertation failed!\n");
- int r = a + b;
- return r>0xF;
- }
- // simple signed 4.4 fixed point multiplication
- int mul(int a, int b)
- {
- if ((unsigned int)a > 0xFF || (unsigned int)b > 0xFF)
- printf("Assertation failed!\n");
- return (((int)(char)a*(int)(char)b)>>4)&0xFF;
- }
- // karatsuba test signed 4.4 fixed point multiplication
- int mul2(int a, int b)
- {
- if ((unsigned int)a > 0xFF || (unsigned int)b > 0xFF)
- printf("Assertation failed!\n");
- int s=1;
- if ((char)a < 0)
- {
- s *= -1;
- a = -(char)a;
- }
- if ((char)b < 0)
- {
- s *= -1;
- b = -(char)b;
- }
- if ((unsigned int)a > 0xFF || (unsigned int)b > 0xFF)
- printf("Assertation failed!\n");
- int z1 = ((a&0xF)*(b&0xF))&0xFF; //mul low
- int z3 = ((a>>4)*(b>>4))&0xFF; // mul high
- int x = ((a>>4)-(a&0xF))*((b>>4)-(b&0xF))&0xFF; // mul :S
- int y = (z1-x)&0xFF;
- int z2 = (y+z3)&0xFF; // z2 now calculated
- int r1 = ((z1>>4)+z2&0xF); // sum low part
- int c = add_c((z1>>4),z2&0xF)?1:0; // check carry
- int r2 = ((z2>>4)+(z3&0xF)+c)&0xF; // sum high part
- int r = (r1)|(r2<<4); // combine result
- if (s == -1) // sign invert
- r = ((~r)+((z1)&0xF?0:1))&0xFF;
- return r; // hurray!
- }
- int main()
- {
- for (int a=0; a<0x100; ++a)
- for (int b=0; b<0x100; ++b)
- {
- if (mul(a,b) != mul2(a,b))
- printf("mul(%02X,%02X)=%02X!=%02X=mul2(%02X,%02X)\n",a,b,mul(a,b),mul2(a,b),a,b);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement