Back

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

Back