#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <inttypes.h>
 
uint32_t multiply (uint16_t a, uint16_t b)
{
  register uint32_t result = 0;
  char n = 0, n2 = 15;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  n++; n2--;

    result += (a &  ( (int16_t)( ( b & (1 << n) ) << n2 ) ) / ( 1 << 15) ) << n;  
  return result;
}
 
int main(void)
{
 
  uint16_t a, b;
  a = 0;
  b = 0;
  
  do
  {
    if (multiply(a, b) != a * b)
    
    
      fprintf(stderr,
               "ERROR:\n"
               "my: %u\n"
               "norm: %u\n"
               "%hu * %hu\n"
               "\n",
               multiply(a, b), (a * b),a, b
             );

    if (UINT16_MAX == a)
    {
      b++;
    }
    a++;
  //fprintf(stderr, "%hu * %hu\n", a, b);
  } while ( ( a != 0 ) || (b != 0) );
  
  fprintf(stderr, "%"PRIu16"* ""%"PRIu16"\n", a, b);
  printf("Done!\n");
 
  return 0;
}