Conference Topic:
Create a 16 bit binary number with a binary point somewhere in the string of bits.
Multiply (or divide) the number by one of the following:
* Decimal 4
* Decimal 8
* Decimal 16
Response:
Theresa L. Ford on 03-22-2004
Calculate 69.2812510 * 410
using a 16 bit signed number with a
fixed binary point after the 11th bit.
1. Analysis of data format.
Position: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Value: Sign 512 256 128 64 32 16 8 4 2 1 .5 .25 .125 .0625 .03125
Minimum value: -1023.9687510
Maximum value: 1023.9687510
2. Convert decimal to binary.
2.A. 69.2812510 = ?2
Value: Sign 512 256 128 64 32 16 8 4 2 1 .5 .25 .125 .0625 .03125
0 0 0 0 1 0 0 0 1 0 1 0 1 0 0 1
69.2812510 = 0001000101.010012 # Sign bit temporarily removed.
OR:
Split 69.28125 into whole number ( 69 ) and fraction ( .28125 ).
Convert whole number to binary.
69 / 2 = 34 R 1
34 / 2 = 17 R 0
17 / 2 = 8 R 1
8 / 2 = 4 R 0
4 / 2 = 2 R 0
2 / 2 = 1 R 0
1 / 2 = 0 R 1
Read remainder from end to beginning ( 1000101 ).
Pad left with zeros to 10 bits. ( 0001000101 ).
6910 = 00010001012
Convert fraction to binary.
.28125 * 2 = 0.5625
.5625 * 2 = 1.125
.125 * 2 = 0.25
.25 * 2 = 0.5
.5 * 2 = 1
Read whole number from beginning to end ( .01001 ).
Pad right with zeros to 5 bits ( .01001 ).
.2812510 = .010012
Combine binary whole number with binary fraction.
6910 = 00010001012
.2812510 = 010012
69.2812510 = 0001000101.010012
2.B. 410 = ?2
410 = 0000000000001002 # Sign bit temporarily removed.
3. Multiply 0001000101.010012 * 0000000000001002
Bit shift left 2 places ( 22 = 410 ).
0001000101.010012 << 210 = 0100010101.001002
No overflow.
Include sign.
positive number * positive number = positive number
sign of first number + sign of second number = sign of result (no carry)
0 + 0 = 0
00001000101.010012 * 00000000000001002 = 00100010101.001002
OR:
Standard Multiplication
0001000101.010012
x 1002 # Trimmed leading 0's on 410
0000000000000002 # Multiply by 0
0000000000000002 # Multiply by 0
+ 0001000101010012 # Multiply by 1
000100010101001002 # Add
000100010101.001002 # Include decimal point
0100010101.001002 # Truncate to 15 bits, Overflow 0
00100010101.001002 # Include sign ( 0 + 0 )
00001000101.010012 * 00000000000.001002 = 00100010101.001002
OR:
Booth's Algorithm
0001000101.010012
x 1002 # Trimmed leading 0's on 410
+ 0001000101010012 # Skip zeros, multiply by 1
000100010101001002 # Add
000100010101.001002 # Include decimal point
0100010101.001002 # Truncate to 15 bits, Overflow 0
00100010101.001002 # Include sign ( 0 + 0 )
00001000101.010012 * 00000000000.001002 = 00100010101.001002
3. Check (convert answer to decimal).
00001000101.010012 * 00000000000.001002 = 00100010101.001002
Value: Sign 512 256 128 64 32 16 8 4 2 1 .5 .25 .125 .0625 .03125
0 0 1 0 0 0 1 0 1 0 1 0 0 1 0 0
25610 + 1610 + 410 + 110 + .12510 = 277.125
4. Summary.
00001000101.010012 69.28125
x 00000000000001002 x 4
00100010101.001002 277.125