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

uint32_t umul32(uint32_t a, uint32_t b)
{
    if (a < b) {
        uint32_t tmp = a;
        a = b;
        b = tmp;
    }
    uint32_t result = 0;
    while (b) {
        result += (b & 1) ? a : 0;
        a <<= 1;
        b >>= 1;
    }
    return result;
}

int32_t imul32(int32_t a, int32_t b)
{
    if (a < 0) {
        a = -a;
        b = -b;
    }
    if (b < 0) {
        a = -a;
        b = -b;
    }
    return umul32((uint32_t)a, (uint32_t)b);
}

int main()
{
    for (uint32_t i = 0; i <= 100; i++) {
        for (uint32_t j = 0; j <= 10; j++) {
            uint32_t result = umul32(i, j);
            printf("%d * %d = %d\n", i, j, result);
            assert(result == i * j);
        }
    }
    for (int32_t i = -100; i <= 100; i++) {
        for (int32_t j = -100; j <= 100; j++) {
            int32_t result = imul32(i, j);
            printf("%d * %d = %d\n", i, j, result);
            assert(result == i * j);
        }
    }
}