Christmas Cracker Mystery Calculator
Python 2, 99 96 93 91 bytes
k=1
while 1:print('%2d '*7+'%2d\n')*4%tuple(n for n in range(64)if k&amp;n),11/(k&lt;32)*' -';k*=2

Exits with an error, which is allowed by default.
Try it online! or verify the MD5 hash.
How it works
After initializing k as 1, we enter an infinite loop that executes the following code.
print('%2d '*7+'%2d\n')*4%tuple(n for n in range(64)if k&amp;n),11/(k&lt;32)*' -';k*=2

tuple(n for n in range(64)if k&amp;n) creates a tuple of all non-negative integers below 64 that have there jth bit set, where j is the iteration count of the loop, i.e., 2j = k.
('%2d '*7+'%2d\n')*4 first creates the format string '%2d %2d %2d %2d %2d %2d %2d \n', then repeats it four times. This is a template for each card, which pads each integer in the tuple to two characters (prepending spaces), separates each group of 8 integers by spaces, and the groups themselves by linefeeds.
Now, Python 2's print statement is a curious beast. It takes several expressions, separated by commata, and prints them one by one. It evaluates the first expression, prints it, evaluates the next expressions, prints it, etc. until no more expressions are left. Unless the last expression is followed by a comma, it appends a linefeed to it. Also, it prepends a space to all expressions, unless they are printed at the beginning of a line.
In each iteration, we first print the result of applying the format string to the tuple. We're at the beginning of a line, so no space is prepended.
Then, we (attempt to) print the result of 11/(k&lt;32)*' -'. If k &lt; 32, this expressions evaluates to ' - - - - - - - - - - -'. Again, we're at the beginning of a line, so no space is prepended. There is no comma after this expression, so print appends a linefeed. However, in the sixth iteration, k = 25 = 32, so trying to evaluate 11/(k&lt;32)*' -' raises an uncaught ZeroDivisionError. This breaks out of the loop and ends the program immediately.