#include <stdio.h>
typedef unsigned char uint8;
typedef unsigned short uint16;
uint16 Mul8x8(uint8 a, uint8 b)
{
int cnt;
uint16 prod = 0;
for (cnt = 8; cnt > 0; cnt--)
{
prod += prod;
if (a & 0x80)
prod += b;
a += a;
}
return prod;
}
const uint8 Multipliers[][2] =
{
{ 0x00, 0x01 },
{ 0x01, 0x00 },
{ 0x33, 0x10 },
{ 0x11, 0x0C },
{ 0x0F, 0x0F },
{ 0x80, 0x80 },
{ 0xFF, 0xFF },
};
int main(void)
{
int i;
for (i = 0; i < sizeof(Multipliers) / sizeof(Multipliers[0]); i++)
{
uint8 a = Multipliers[i][0];
uint8 b = Multipliers[i][1];
uint16 p = a * b;
uint16 p2 = Mul8x8(a, b);
printf("0x%02X * 0x%02X = 0x%04X %c= 0x%04X\n", a, b, p, "!="[p == p2], p2);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWludDg7CnR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWludDE2OwoKdWludDE2IE11bDh4OCh1aW50OCBhLCB1aW50OCBiKQp7CiAgaW50IGNudDsKICB1aW50MTYgcHJvZCA9IDA7CgogIGZvciAoY250ID0gODsgY250ID4gMDsgY250LS0pCiAgewogICAgcHJvZCArPSBwcm9kOwoKICAgIGlmIChhICYgMHg4MCkKICAgICAgcHJvZCArPSBiOwoKICAgIGEgKz0gYTsKICB9CgogIHJldHVybiBwcm9kOwp9Cgpjb25zdCB1aW50OCBNdWx0aXBsaWVyc1tdWzJdID0KewogIHsgMHgwMCwgMHgwMSB9LAogIHsgMHgwMSwgMHgwMCB9LAogIHsgMHgzMywgMHgxMCB9LAogIHsgMHgxMSwgMHgwQyB9LAogIHsgMHgwRiwgMHgwRiB9LAogIHsgMHg4MCwgMHg4MCB9LAogIHsgMHhGRiwgMHhGRiB9LAp9OwoKaW50IG1haW4odm9pZCkKewogIGludCBpOwoKICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKE11bHRpcGxpZXJzKSAvIHNpemVvZihNdWx0aXBsaWVyc1swXSk7IGkrKykKICB7CiAgICB1aW50OCBhID0gTXVsdGlwbGllcnNbaV1bMF07CiAgICB1aW50OCBiID0gTXVsdGlwbGllcnNbaV1bMV07CgogICAgdWludDE2IHAgPSBhICogYjsKICAgIHVpbnQxNiBwMiA9IE11bDh4OChhLCBiKTsKCiAgICBwcmludGYoIjB4JTAyWCAqIDB4JTAyWCA9IDB4JTA0WCAlYz0gMHglMDRYXG4iLAogICAgICAgICAgIGEsIGIsIHAsICIhPSJbcCA9PSBwMl0sIHAyKTsKICB9CgogIHJldHVybiAwOwp9Cg==