Part 8
Once convinced that the binary method does have its merits, it may be a little easier to pursue a mastery of representing numbers in binary notation, difficult as it may seem at the outset. The usual way to convert is to remember, or list, the powers of 2, and start at the left side with the largest power that can be divided into the decimal number we want to convert. Suppose we want to change the number 500 into binary. First we make a chart of the positions:
Power of 2 8 7 6 5 4 3 2 1 0 ───────────────────────────────────────────────────────────── Decimal Number 256 128 64 32 16 8 4 2 1 ───────────────────────────────────────────────────────────── Binary Number 1 1 1 1 1 0 1 0 0
Since 256 is the largest number that will go into 500, we start there, knowing that there will be nine binary digits, or “bits” in our answer. We place a 1 in that space to indicate that there is indeed an eighth power of 2 included in 500. Since 128 will go into the remainder, we put a 1 in that space also. Continuing in this manner, we find that we need 1’s until we reach the “8” space which we must skip since our remainder does not contain an 8. We mark a 1 in the 4 space, but skip the 2 and the 1. Our answer, then, in binary notation is 111110100. This number is called “pure binary.” It can also lead to pure torture for human programmers whose eyes begin to bug with this “bit chasing,” as it has come to be called. Everything is of course relative, and the ancient Roman might gladly have changed DCCCLXXXVIII to binary 1101111000, which is two digits shorter.
There is a simpler way of converting that might be interesting to try out. We’ll start with our same 500. Since it is an even number, we put a 0 beneath it. Moving to the left, we divide by two and get 250. This also is an even number, so we mark down a 0 in our binary equivalent. The next division gives 125, an odd number, so we put down a 1. We continue to divide successively, marking a zero for each even remainder, and a 1 for the odd. Although it may not be obvious right away, we are merely arriving at powers of two by a process called mediation, or halving.
Decimal 1 3 7 15 31 62 125 250 500 ───────────────────────────────────────────────────── Binary 1 1 1 1 1 0 1 0 0
Obviously we can reverse this procedure to convert binary numbers to their decimal equivalents.
There is an interesting extension of this process called duplication by which multiplication can be done quite simply. Let us multiply 95 times 36. We will halve our 95 as we did in the earlier example, while doubling the 36. This time when we have an even number in the left column, we will simply cancel out the corresponding number in the right column.
95 36 47 72 23 144 11 288 5 576 2 **** 1 2304 —— 3420
This clever bit of mathematics is called Russian peasant multiplication, although it was also known to early Egyptians and many others. It permits unschooled people, with only the ability to add and divide, to do fairly complex multiplication problems. Actually it is based on our old stand-by, the binary system. What we have done is to represent the 95 “dyadically,” or by twos, and to multiply 36 successively by each of these powers as applicable. We will not digress further, but leave this as an example of the tricks possible with the seemingly simple binary system.
Even after we have learned to convert from the decimal numbers we are familiar with into binary notation almost by inspection, the results are admittedly unwieldy for human handling. An employee who is used to getting $105 a week would be understandably confused if the computer printed out a check for him reading $1101001. For this reason the computer programmer has reached a compromise with the machine. He speaks decimal, it speaks binary; they meet each other halfway with something called binary-coded decimal. Here’s the way it works.
A little thought will show that the decimal numbers from 0 through 9 can be presented in binary using four bits. Thus:
_Decimal_ _Binary_ 0 0 1 1 2 110 3 111 4 1100 5 1101 6 1110 7 10111 8 11000 9 11001
In the interest of uniformity we fill in the blanks with 0’s, so that each decimal number is represented by a four-digit block, or word, of binary code. Now when the computer programmer wants to feed the number 560 into the computer in binary he breaks it into separate words of 5, 6, and 0; or 0101, 0110, and 0000. In effect, we have changed $5 words into four-bit words! The computer couldn’t care less, since it handles binary digits at the rate of millions a second; and the human is better able to keep his marbles while he works with the computer. Of course, there are some computers that are classed as pure binary machines. These work on mathematical problems, with none of the restrictions imposed by human frailty. For the computer the pure binary system is more efficient than the binary decimal compromise.
The four-digit words can be made to represent not only numbers, but letters as well. When this is done it is called an alpha-numeric or alphameric code. Incidentally, it is conceivable that language could be made up of only 1’s and 0’s, or perhaps _a_’s and _b_’s would be better. All it would take would be the stringing together of enough letters to cover all the words there are. The result would be rather dull, with words like _aabbababaabbaaba_, _bbaabbaabababaaabab_, and _aaaaaaaaabaaa_; it is doubtful that the computer will make much headway with a binary alphabet for its human masters.
In the early days of binary computer work, the direct conversion to binary code we have discussed was satisfactory, but soon the designers of newer machines and calculating methods began to juggle the digits around for various reasons. For one thing, a decimal 0 was represented by four binary 0’s. Electrically, this represents no signal at all in the computer’s inner workings. If trouble happened, say a loose connection, or a power failure for a split second, the word 0000 might be printed out and accepted as a valid zero when it actually meant a malfunction. So the designers got busy trying other codes than the basic binary.
One clever result is the “excess-3” code. In this variation 3 is added to each decimal number before conversion. A decimal 30 is then represented by the word 0011 instead of 0000. There is, in fact, no such computer word as 0000 in excess-3 code. This eliminates the possibility of an error being taken for a 0. Excess-3 does something else too. If each digit is changed, that is, if 1’s become 0’s and 0’s become 1’s, the new word is the “9’s complement” of the original. For example, the binary code for 4 in excess-3 is 0111. Changing all the digits, we get 1000, which is decimal 5. This is not just an interesting curiosity, but the 9’s complement of 4 (9 minus 4). Anyone familiar with an adding machine is used to performing subtraction by using complements of numbers. The computer cannot do anything but add; by using the excess-3 code it can subtract by adding. Thus, while the computer cannot subtract 0110 from 1000, it can quite handily add 1001 to 1000 to get the same result.
There are many other reasons for codes, among them being the important one of checking for errors. “Casting out nines” is a well-known technique of the bookkeeper for locating mistakes in work. Certain binary codes, containing what is called a “parity bit,” have the property of self-checking, in a manner similar to casting out nines. A story is told of some pioneer computer designers who hit on the idea of another means of error checking not as effective as the code method.
The idea was clever enough, it being that identical computers would do each problem and compare answers, much like the pairs of abacus-wielders in Japan’s banks. In case both computers did not come up with the same answer, a correction would be made. With high hopes, the designers fed a problem into the machines and sat back to watch. Soon enough a warning light blinked on one machine as it caught an error. But simultaneously a light blinked on the other. After that, chaos reigned until the power plugs were finally pulled. Although made of metal and wires, the computers demonstrated a remarkably human trait; each thought the other was wrong and was doing its best to change its partner’s answer! The solution, of course, was to add a third computer.
Binary decimal, as we have pointed out, is a wasteful code. The decimal number 100 in binary decimal coding is 0001 0000 0000, or 12 digits. Pure binary is 1100100, or only 7 digits. By going to a binary-octal code, using eight numbers instead of ten, the words can be 3-bit instead of 4-bit. This is called an “economy” code, and finds some application. There are also “Gray” codes, reflected binary codes, and many more, each serving a particular purpose. Fortunately for the designer, he can be prodigal with his use of codes. With 4-bit words, 29 _billion_ codes are available, so a number of them are still unused.
Having translated our decimal numbers into code intelligible to our computer, we still have the mathematical operations to perform on it. With a little practice we can add, subtract, multiply, and divide our binary numbers quite easily, as in the examples that follow.
Addition: 1100 (12) 0111 ( 7) —— —— 10011 (19)
Subtraction: 1010 (10) - 0010 ( 2) ——— —— 1000 (8)
Multiplication: 0110 (6)
× 0011 (3)
——— –——
0110
0110
0000
0000
———
10010 (18)
TN1 Division: 1010 ÷ 10 = 0101 (10 ÷ 2 = 5)
The rules should be obvious from these examples. Just as we add 5 and 5 to get 0 with 1 to carry, we add 1 and 1 and get 0 with 1 to carry in binary. Adding 1 and 0 gives 1, 0 and 0 gives 0. Multiplying 1 times 1 gives 1, 1 times 0 gives 0, and 0 times 0 gives 0. One divides into 1 once, and into 0 no times. Thus we can manipulate in just the manner we are accustomed to.
The computer does not even need to know this much. All it is concerned with is addition: 1 plus 1 gives 0 and 1 to carry; 1 plus 0 gives 1; and 0 plus 0 gives 0. This is all it knows, and all it needs to know. We have described how it subtracts by adding complements. It can multiply by repetitive additions, or more simply, by shifting the binary number to the left. Thus, 0001 becomes 0010 in one shift, and 0100 in two shifts, doubling each time. This is of course just the way we do it in the decimal system. Shifting to the right divides by two in the binary system.
The simplest computer circuitry performs additions in a serial manner, that is, one operation at a time. This is obviously a slow way to do business, and by adding components so that there are enough to handle the digits in each row simultaneously the arithmetic operation is greatly speeded. This is called parallel addition. Both operations are done by parts understandably called adders, which are further broken down into half-adders.
There are refinements to basic binary computation, of course. By using a decimal point, or perhaps a binary point, fractions can be expressed in binary code. If the position to the left of the point is taken as 2 to the zero power, then the position just to the right of the point is logically 2 to the minus one, which if you remember your mathematics you’ll recognize as one-half. Two to the minus two is then one-fourth, and so on. While we are on the subject of the decimal point, sophisticated computers do what is called “floating-point arithmetic,” in which the point can be moved back and forth at will for much more rapid arithmetical operations.
No matter how many adders we put together and how big the computer eventually gets, it is still operating in what seems an awkward fashion. It is counting its fingers, of which it has two. The trick is in the speed of this counting, so fast that one million additions a second is now a commonplace. Try that for size in your own decimally trained head and you will appreciate the computer a little more.
_The Logical Algebra_
We come now to another most important reason for the effectiveness of the digital computer; the reason that makes it the “logical” choice for not only mathematics but thinking as well. For the digital computer and logic go hand in hand.
Logic, says Webster, is “the science that deals with canons and criteria of validity in thought and demonstration.” He admits to the ironic perversion of this basic definition; for example, “artillery has been called the ‘_logic_ of kings,’” a kind of logic to make “argument useless.” Omar Khayyám had a similar thought in mind when he wrote in _The Rubáiyát_,
The grape that can with logic absolute, The Two-and-Seventy Sects confute.
Other poets and writers have had much to say on the subject of logic through the years, words of tribute and words of warning. Some, like Lord Dunsany, counsel moderation even in our logic. “Logic, like whiskey,” he says, “loses its beneficial effect when taken in too large quantities.” And Oliver Wendell Holmes asks,
Have you heard of the wonderful one-hoss shay That was built in such a logical way It ran a hundred years to the day?
The words logic and logical are much used and abused in our language, and there are all sorts of logic, including that of women, which seems to be a special case. For our purposes here it is best to stick to the primary definition in the dictionary, that of validity in thought and demonstration.
Symbolic logic, a term that still has an esoteric and almost mystical connotation, is perhaps mysterious because of the strange symbology used. We are used to reasoning in words and phrases, and the notion that truth can be spelled out in algebraic or other notation is hard to accept unless we are mathematicians to begin with.
We must go far back in history for the beginnings of logic. Aristotelian logic is well known and of importance even though the old syllogisms have been found not as powerful as their inventors thought. Modern logicians have reduced the 256 possible permutations to a valid 15 and these are not as useful as the newer kind of logic that has since come into being.
Leibniz is conceded to be the father of modern symbolic logic, though he probably neither recognized what he had done nor used it effectively. He did come up with the idea of two-valued logic, and the cosmological notion of 1 and 0, or substance and nothingness. In his _Characteristica Universalis_ he was groping for a universal language for science; a second work, _Calculus Ratiocinator_, was an attempt to implement this language. Incidentally, Leibnitz was not yet twenty years old when he formulated his logic system.
Unfortunately it was two centuries later before the importance of his findings was recognized and an explanation of their potential begun. In England, Sir William Hamilton began to refine the old syllogisms, and is known for his “quantification of the predicate.” Augustus De Morgan, also an Englishman, moved from the quantification of the predicate to the formation of thirty-two rules or propositions that result. The stage was set now for the man who has come to be known as the father of symbolic logic. His name was George Boole, inventor of Boolean algebra.
In 1854, Boole published “An Investigation of the Laws of Thought on which are Founded the Mathematical Theories of Logic and Probabilities.” In an earlier pamphlet, Boole had said, “The few who think that there is that in analysis which renders it deserving of attention for its own sake, may find it worth while to study it under a form in which every equation can be solved and every solution interpreted.” He was a mild, quiet man, though nonconformist religiously and socially, and his “Investigation” might as well have been dropped down a well for all the immediate splash it made in the scientific world. It was considered only academically interesting, and copies of it gathered dust for more than fifty years.
Only in 1910 was the true importance given to Boole’s logical calculus, or “algebra” as it came to be known. Then Alfred North Whitehead and Bertrand Russell made the belated acknowledgment in their _Principia Mathematica_, and Russell has said, “Pure mathematics was discovered by Boole, in a work he called ‘The Laws of Thought.’” While his praise is undoubtedly exaggerated, it is interesting to note the way in which mathematics and thought are considered inseparable. In 1928, the first text on the new algebra was published. The work of Hilbert and Ackermann, _Mathematical Logic_, was printed first in German and then in English.
What was the nature of this new tool for better thinking that Boole had created? Its purpose was to make possible not merely precise, but _exact_ analytical thought. Historically we think in words, and these words have become fraught with semantic ditches, walls, and traps. Boole was thinking of thought and not mathematics or science principally when he developed his logic algebra, and it is indicative that symbolic logic today is often taught by the philosophy department in the university.
Russell had hinted at the direction in which symbolic logic would go, and it was not long before the scientist as well as the mathematician and logician did begin to make use of the new tool. One pioneer was Shannon, mentioned in the chapter on history. In 1938, Claude Shannon was a student at M.I.T. He would later make scientific history with his treatise on and establishment of a new field called information theory; his early work was titled “A Symbolic Analysis of Relay and Switching Circuits.” In it he showed that electrical and electronic circuitry could best be described by means of Boolean logic. Shannon’s work led to great strides in improving telephone switching circuits and it also was of much importance to the designer of digital computers. To see why this is so, we must now look into Boolean algebra itself. As we might guess, it is based on a two-valued logic, a true-false system that exactly parallels the on-off computer switches we are familiar with.
The Biblical promise “Ye shall know the truth, and the truth shall make you free” applies to our present situation. The best way to get our feet wet in the Boolean stream is to learn its so-called “truth tables.”
_Conjunctive Boolean Operation_
A _and_ B equal C A B C (A · B = C) ——— 0 0 0 1 0 0 0 1 0 1 1 1
_Disjunctive Boolean Operation_
A _or_ B equals C A B C (Ā ∨ B = C) ——— 0 0 0 1 0 1 0 1 1 1 1 1
In the truth tables, 1 symbolizes true, 0 is false. In the conjunctive AND operation, we see that only if both A and B are true is C true. In the disjunctive OR operation, if _either_ A _or_ B is true, then C is also true. From this seemingly naïve and obvious base, the entire Boolean system is built, and digital computers can perform not only complex mathematical operations, but logical ones as well, including the making of decisions on a purely logical basis.
Before going on to the few additional conditions and combinations that complete the algebra, let’s study some analogies that will make clear the AND/OR principles of operation. We can think of AND as two bridges in sequence over two rivers. We can reach our destination only if both bridges are working. However, suppose there are two parallel bridges and only one river. We can then cross if either or both of the bridges is working. A closer example is that of electrical switches. Current will flow through our AND circuit if—and only if—both switches are closed. When the switches are in parallel—an OR circuit—current will flow if either, or both, are closed.
The truth tables resemble the bridge or switch arrangements. We can proceed across the line of 1’s and 0’s in the first table only if both switches are closed. The symbol 1 means that the switch is closed, so we can cross only the bottom line. In the second table, we are told we can proceed across the line if either switch is closed. Thus we can cross lines 2, 3, and 4. We can use many symbols in our two-valued system.
_Symbol_
Bridge No Bridge
Power No Power
1 0
True False
A little imagination suggests a logic computer of sorts with one switch, a battery, and a light bulb. Suppose we turn on the switch when we drive into our garage. A light in the hallway then indicates that the car is available. By using two switches we can indicate that a second car is also in the garage; or that either of them is, simply by choosing between AND logic and OR logic. Childish as this seems, it is the principle of even our most complex thinking processes. You will remember that the brain is considered a digital computer, since neurons can only be on or off. All it takes is 10 billion neuron switches!
[Illustration:
_Remington Rand UNIVAC_
AND and OR gates in series. Switches 1 _and_ 2, plus 3 _or_ 4, are needed to light the bulb. ]
In addition to the conjunctives AND and OR, Boolean algebra makes use of the principle of negation. This is graphically illustrated thus:
_Original_ _Negation_ A Ā 1 0 0 1
The negation device used in computer circuitry is called an inverter, since it changes its input from a 1 to a 0, or vice versa. The usefulness of such an element is obvious when we remember the computer trick of subtracting by adding complements. The inverter circuit used with a code like the excess-3 readily forms these complements.
Further sophistication of the basic Boolean forms leads to units other than the AND and OR gates. Possible are NOT, NOR, and exclusive-OR forms. In the latter, there is an output if one and only one input is present. The NOR circuit is interesting in that it was made possible with the introduction of the transistor; the vacuum tube does not permit this configuration.
[Illustration:
_Computer Control Co._
The functions of two binary variables. ]
Present-day symbolic logic is not the pure Boolean as presented back in 1854. Boole’s OR was the exclusive, one and only one, type. Today the logician generally assumes the either-or connotation. The logic has also been amplified, using the commutative, associative, and distributive laws much like those of conventional algebra. We are indebted to De Morgan for most of this work, showing that A and B equals B and A; A and (A and B) equals (A and B) and A; and so on. While these seem intuitively true, the implications are nonetheless of great importance both in pure logic and its practical use in circuitry.