4

I am trying to understand why the double-dabble algorithm is working, but I am not getting it.

There are a lot of great descriptions of the steps and the purpose of the algorithm, like http://www.classiccmp.org/cpmarchives/cpm/mirrors/cbfalconer.home.att.net/download/dubldabl.txt or http://en.wikipedia.org/wiki/Double_dabble

There are also some attempts of explanation. The best one I found is this one: http://www.minecraftforum.net/forums/minecraft-discussion/redstone-discussion-and/340153-why-does-the-double-dabble-algorithm-work#c6

But I still feel like I am missing the connecting parts. Here is what I get:

  • I get, that you can convert binary numbers to decimal numbers by reading them from left to right, starting with a decimal value of 0, iterating over the digits of the binary number, adding 1 to the decimal number for every 1 you reach in the binary number, and multiplying by 2, when you move on to the next digit (as explained in the last link).
    • But why does this lead to the double-dabble-algorithm? We don't want to convert in decimal, we want to convert in BCD. Why are we keeping the multiplying (shifting), but we drop the adding of 1? Where is the connection?
  • I get, why we have to add 3, when a number in a BCD-field exceeds 4 before shifting. Because if you want that the BCD number gets multiplied by 2 if you shift it, you have to do some fixups. If you shift the BCD number 0000 1000 (8) and you want to get the double 0001 0011 (16), you have to add 3 (the half of 6) before shifting, because by just shifting you end up with 0001 0000 (10) (you're missing 6).
    • But why do we want this and where is the adding of 1 happening?

I guess I am just missing a little part.

Michael Palm
  • 337
  • 5
  • 16

4 Answers4

1

Converting N to its decimal representation involves repeatedly determining R (rest) after dividing by 10. In stead of dividing by 10 you might also divide by 2 (which is just a shift) followed by a division by 5. Hence the 5. Long division means trying to subtract 5 and if that succeeds actually doing the subtraction while keeping track of that success by setting a bit in Q. Adding 3 is the same as subtracting 5 while setting the bit that will subsequently be shifted into Q. Hence the 3.

Architect
  • 11
  • 2
1

16 in binary is 10 in bcd. We want 16 in bcd, so we add 6. but why we add 3 and not 6?

Because adding is done before shifting, so it’s all divided by two, that’s why we add 3 when higher than 5!

Stephen Rauch
  • 47,830
  • 31
  • 106
  • 135
SuperPizz
  • 11
  • 3
0

I think I got it while writing this question: Suppose you want to convert 1111 1111 from binary into BCD.

We use the method to convert the binary number to a decimal number, explained in the question, but we alter it a little bit.

We don't start with a decimal number of 0 but with a BCD number of 0000 0000 (0).

BCD binary

0000 0000 1111 1111

First we have to add 1 to the BCD-number. This can be done by a simple shift

0000 0001 1111 1110

Now we move on and want to multiply the BCD-Number by 2. In the next Step we want to add the current binary digit to the BCD-number. Both can be accomplished in one step by (again) shifting.

0000 0011 1111 1100

This works over and over again. The only situation in which this doesn't work, is when a block of the BCD-numer exceeds 4. In this case you have to do the fixup explained in the question.

After iterating through the binary number, you get the BCD-representation of the number on the left side \o/

Michael Palm
  • 337
  • 5
  • 16
0

The whole idea is to use the shifting explained in your link, but then convert the number on the left into BCD. At each stage, you are getting closer to the actual binary number on the left, but making sure that the number remains in BCD rather than binary.

When you shift in a '1', you are essentially adding it.

Take a look at the link below to get the gist of the 'add 3' argument:

https://olduino.files.wordpress.com/2015/03/why-does-double-dabble-work.pdf

Sidd
  • 103
  • 4