
Last week we took Iris to the pediatrician for a checkup, during which
they weighed, measured, and inoculated her. The measuring device,
which I later learned is called a stadiometer, had a bracket on a slider that went up and down on a
post. Iris stood against the post and the nurse adjusted the bracket
to exactly the top of her head. Then she read off Iris's height from
an attached display.
How did the bracket know exactly what height to report? This was done
in a way I hadn't seen before. It had a
photosensor looking at the post, which was printed with this
pattern:

(Click to view the other pictures I took of the post.)
The pattern is binary numerals. Each numeral is a certain fraction of
a centimeter high, say 1/4 centimeter. If the sensor reads the number
433, that means that the bracket is 433/4 = 108.25 cm off the ground,
and so that Iris is 107.75 cm tall.
The patterned strip in the left margin of this article is a
straightforward translation of binary numerals to black and white
boxes, with black representing 1 and white representing 0:
0000000000
0000000001
0000000010
0000000011
0000000100
0000000101
0000000101
...
1111101000
1111101001
...
1111111111
If you are paying attention, you will notice that although the strip
at left is similar to the pattern in the doctor's office, it is not
the same. That is because the numbers on the post are Gray-coded.
Gray codes solve the following problem with raw binary numbers.
Suppose Iris is close to 104 = 416/4 cm tall, so that the photosensor is in
the following region of the post:
...
0110100001 (417)
0110100000 (416)
0110011111 (415)
0110011110 (414)
...
But suppose that the sensor (or the post) is slightly mis-aligned, so
that instead of properly reading the (416) row, it reads the first
half of the (416) row and last half of the (415) row. That makes
0110111111, which is 447 = 111.75 cm, an error of almost 7.5%.
(That's three inches, for my American and Burmese readers.) Or the
error could go the other way: if the sensor reads the first half of
the (415) and the second half of the (416) row, it will see 0110000000
= 384 = 96 cm.
Gray code is a method for encoding numbers in binary so that each
numeral differs from the adjacent ones in only one position:
0000000000
0000000001
0000000011
0000000010
0000000110
0000000111
0000000101
0000000100
0000001100
...
1000011100
1000011101
...
1000000000
This is the pattern from the post, which you can also see at the right
of this article.
Now suppose that the mis-aligned sensor reads part of the (416) line and
part of the (417) line. With ordinary binary coding, this could
result in an error of up to 7.75 cm. (And worse errors for children
of other heights.) But with Gray coding no error results from the
misreading:
...
0101110000 (417)
0101010000 (416)
0101010001 (415)
0101010011 (414)
...
No matter what parts of 0101110000 and 0101110001 are stitched
together, the result is always either 416 or 417.
Converting from Gray code to standard binary is easy: take the binary
expansion, and invert every bit that is immediately to the right of a
1 bit. For example, in 1111101000, each red bit is to the right of a
1, and so is inverted to obtain the Gray code 1000011100.
Converting back is also easy:
of the Gray code. Replace every sequence of the form 1000...01
with 1111...10; also replace 1000... with 1111... if it appears at the
end of the code. For
example, Gray code 1000011100 contains two such sequences, 100001 and 11, which are
replaced with 111110 and 10, to give 1111101000.