Like @JamesCherril has stated that the multiplication can easily be expressed with continuous of addition.

So basically `a x b = b + b .... b`

(continously add `b`

, `a`

times).

For example: 3 x 1002 = 1002 + 1002 + 1002.

```
unsigned int multiply(unsigned int a, unsigned int b) {
unsigned int result = 0;
for (unsigned int i = 0; i < a; i++) {
result += b;
}
return result;
}
```

Can we be more efficient than this one? We can slightly improve this function further. Noticed that `multiply(3, 1002)`

run faster than `multiply(1002, 3)`

. So, we now know that our code run faster if `a`

is small and `b`

is large. So, we can swap the `b`

with `a`

if `b`

is smaller than `a`

```
unsigned int multiply(unsigned int a, unsigned int b) {
if (a > b) return multiply(b, a);
unsigned int result = 0;
for (unsigned int i = 0; i < a; i++) {
result += b;
}
return result;
}
```

Everything look good now, but can we do better? Of course, we can do even better. We know that we can compute `a x 2^k`

very fast without using any multiplication operation using only shift left. So basically, `a x 2^k`

is the same as `a << k`

. Using this fact, we can easy compute `100 x 5`

as following `100 << 2 + 100`

```
unsigned int multiply2(unsigned int a, unsigned int b) {
unsigned int result = 0;
unsigned int bits ...
```