I am working through a problem which i was able to solve, all but for the last piece - i am not sure how can one do multiplication using bitwise operators:
0*8 = 0 1*8 = 8 2*8 = 16 3*8 = 24 4*8 = 32 Can you please recommend an approach to solve this?
A number can be multiplied by 2 using bitwise operators. This is done by using the left shift operator and shifting the bits left by 1. This results in double the previous number.
We have to multiply n with 10 i.e; n*10, we can write this as n*(2+8) = n*2 + n*8 and since we are not allowed to use multiplication operator we can do this using left shift bitwise operator. So n*10 = n<<1 + n<<3.
The bitwise AND operator ( & ) compares each bit of the first operand to the corresponding bit of the second operand. If both bits are 1, the corresponding result bit is set to 1. Otherwise, the corresponding result bit is set to 0. Both operands to the bitwise AND operator must have integral types.
The number to the left of the operator is shifted the number of places specified by the number to the right. Each shift to the left doubles the number, therefore each left shift multiplies the original number by 2. Use the left shift for fast multiplication or to pack a group of numbers together into one larger number.
To multiply by any value of 2 to the power of N (i.e. 2^N) shift the bits N times to the left.
0000 0001 = 1 times 4 = (2^2 => N = 2) = 2 bit shift : 0000 0100 = 4 times 8 = (2^3 -> N = 3) = 3 bit shift : 0010 0000 = 32 etc..
To divide shift the bits to the right.
The bits are whole 1 or 0 - you can't shift by a part of a bit thus if the number you're multiplying by is does not factor a whole value of N ie.
since: 17 = 16 + 1 thus: 17 = 2^4 + 1 therefore: x * 17 = (x * 16) + x in other words 17 x's thus to multiply by 17 you have to do a 4 bit shift to the left, and then add the original number again:
==> x * 17 = (x * 16) + x ==> x * 17 = (x * 2^4) + x ==> x * 17 = (x shifted to left by 4 bits) + x so let x = 3 = 0000 0011 times 16 = (2^4 => N = 4) = 4 bit shift : 0011 0000 = 48 plus the x (0000 0011) ie.
0011 0000 (48) + 0000 0011 (3) ============= 0011 0011 (51) Edit: Update to the original answer. Charles Petzold has written a fantastic book 'Code' that will explain all of this and more in the easiest of ways. I thoroughly recommend this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With