Binary numbers are a base 2 numeral system.
A binary number is a number expressed in the base-2 numeral system, which uses only two symbols: 0 and 1. Each digit is referred to as a bit. Because of its straightforward implementation in digital electronic circuitry using logic gates, the binary system is used by almost all modern computers and computer-based devices.
- Bit: The smallest unit in computers. It is either a 1 or a 0.
- Nibble: Half a byte, or 4 bits.
- Byte: 8 bits together form one byte, a number from 0 to 255. Bits in a byte are numbered starting from the right at 0.
- Short: Two bytes put together are 16 bits, forming a number from 0 to 65535. The low byte is the rightmost eight bits.
- Big Endian: Stores data big-end first. When looking at multiple bytes, the first byte (lowest address) is the biggest.
- Little Endian: Stores data little-end first. When looking at multiple bytes, the first byte is smallest.
Conversion
Break down the binary value in chunks of 4, multiply each 1 by its equivalent value, either 8, 4, 2 or 1. Add the resulting numbers together to get the result. For example, the value 1100, or (8*1 + 4*1), is equal to C(decimal 12).
1101 0101(D5) | ||||||||
|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | Binary |
| 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | Values |
| 128 | 64 | 16 | 4 | 1 | Result: 213 | |||
Binary Arithmetic
In the first column, divide the first number by 2 by removing the last bit, until 1 is reached. In the second column, multiply by 2 by adding an extra bit of 0. The answer is found by adding the numbers in the second column with odd numbers in the first column. A binary number ending with 1 is odd.
| 35 | 19 |
|---|---|
100011 | 10011 |
10001 | 100110 |
1000 | 1001100 |
100 | 10011000 |
10 | 100110000 |
1 | 1001100000 |
1010011001 |
This example multiplies 35 by 19, to arrive at a result of 665. The result 1010011001 can be deconstucted as:
10 1001 1001 = 1 + 8 + 16 + 128 + 512 = 665
Binary numbers can be multiplied and divided by multiples of 2, by rotating one bit left to multiply by 2, or one bit right to divide by 2.
| 22 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | |
|---|---|---|---|---|---|---|---|---|---|
| 44 | ROL | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 |
| 11 | ROR | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 |
Binary Logic
AND, or "both", sets individual bits to 0. AND is useful for masking bits, for example, to mask the high order bits of a value AND with $0F: $36 AND $0F = $06. RA, or "either one or both", sets individual bits to 1. OR is useful for setting a particular bit, for example, $80 OR $08 = $88. XOR, or "one or the other but not both", inverts individual bits.
| input | output | AND(d) | OR(ɥ) | XOR(z) |
| 0 | 1 | 0 | 1 | 1 |
| 0 | 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
Have a look at the Flipstick alphabet as a notation for logic.
To activate the 1st, 2nd and 4th bits:
| 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 |
unsigned char num = 0; num |= (1 << 0); num |= (1 << 1); num |= (1 << 3);
To deactivate the 1st, 4th and 6th bits:
| 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
unsigned char num = 255; num &= ~(1 << 0); num &= ~(1 << 3); num &= ~(1 << 5);
To read value of bit:
(num >> bit) & 1;
If Bit 7 is not set (as in the first example) the representation of signed and unsigned numbers is the same. However, when Bit 7 is set, the number is always negative. For this reason Bit 7 is sometimes called the sign bit.
| Binary | Unsigned | Signed |
| 0010 0011 | 35 | 35 |
| 1010 0011 | 163 | -93 |
| 1111 1111 | 255 | -1 |
| 1000 0000 | 128 | -128 |
Fixed-Point
A fixed-point number is a number that has a fixed number of digits after the decimal point. If, for example, we use 8 bits to store a number with decimal points, we could decide to store it this way. The high and low nibbles have the same resolution.
| Integer Part | Decimal Points | |||||||
|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0.0 |
| 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 3.a |
| 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 4.5 |
To turn a regular integer into fixed point, shift left by the number of fractional bits(width << bits), and to turn a fixed point into integer, shift right by the number of fractional bits(width >> bits).
To multiply, you do the multiply, and then you shift right by the number of fractional bits.
(3.8 * 2.0) >> 8
To divide, you first shift the numerator left by the number of fractional bits, then you do the division.
(3.8 << 8) / 2.0
Binary Stack Encoding
A stack of zeros and ones can be encoded in a single number by keeping with bit-shifting and incrementing.
- Pushing a 0 onto the stack is equivalent to doubling the number.
- Pushing a 1 is equivalent to doubling and adding 1.
- Popping is equivalent to dividing by 2, where the remainder is the number.
int
push(int stack, int bit) {
return (stack << 1) + bit;
}
int
pop(int stack, int *acc) {
*acc = stack & 0x1;
return stack >> 1;
}
int
dup(int stack) {
int a, res = pop(stack, &a);
return push(push(res, a), a);
}
int
swap(int stack) {
int a, b, res = pop(pop(stack, &a), &b);
return push(push(res, a), b);
}
int
echo(int stack) {
int bit;
printf(" .. ");
while(stack > 1)
stack = pop(stack, &bit), printf("%d ", bit);
printf("< \n");
return stack;
}
The above defines the primitives of a small stack machine that utilizes a single number as memory, this strategy is at the core of the Fractran stack machine.
echo(dup(swap(push(push(push(push(1, 0), 1), 0), 1)))); 0 1 0 1 swap dup .
| 16 | .. 0 0 0 0 | 17 | .. 1 0 0 0 |
|---|---|---|---|
| 24 | .. 0 0 0 1 | 25 | .. 1 0 0 1 |
| 20 | .. 0 0 1 0 | 21 | .. 1 0 1 0 |
| 28 | .. 0 0 1 1 | 29 | .. 1 0 1 1 |
| 18 | .. 0 1 0 0 | 19 | .. 1 1 0 0 |
| 26 | .. 0 1 0 1 | 27 | .. 1 1 0 1 |
| 22 | .. 0 1 1 0 | 23 | .. 1 1 1 0 |
| 30 | .. 0 1 1 1 | 31 | .. 1 1 1 1 |
| Dec | Hex | Bin | Dec | Hex | Bin | Dec | Hex | Bin | Dec | Hex | Bin |
| 0 | 0 | 00000000 | 64 | 40 | 01000000 | 128 | 80 | 10000000 | 192 | c0 | 11000000 |
| 1 | 1 | 00000001 | 65 | 41 | 01000001 | 129 | 81 | 10000001 | 193 | c1 | 11000001 |
| 2 | 2 | 00000010 | 66 | 42 | 01000010 | 130 | 82 | 10000010 | 194 | c2 | 11000010 |
| 3 | 3 | 00000011 | 67 | 43 | 01000011 | 131 | 83 | 10000011 | 195 | c3 | 11000011 |
| 4 | 4 | 00000100 | 68 | 44 | 01000100 | 132 | 84 | 10000100 | 196 | c4 | 11000100 |
| 5 | 5 | 00000101 | 69 | 45 | 01000101 | 133 | 85 | 10000101 | 197 | c5 | 11000101 |
| 6 | 6 | 00000110 | 70 | 46 | 01000110 | 134 | 86 | 10000110 | 198 | c6 | 11000110 |
| 7 | 7 | 00000111 | 71 | 47 | 01000111 | 135 | 87 | 10000111 | 199 | c7 | 11000111 |
| 8 | 8 | 00001000 | 72 | 48 | 01001000 | 136 | 88 | 10001000 | 200 | c8 | 11001000 |
| 9 | 9 | 00001001 | 73 | 49 | 01001001 | 137 | 89 | 10001001 | 201 | c9 | 11001001 |
| 10 | a | 00001010 | 74 | 4a | 01001010 | 138 | 8a | 10001010 | 202 | ca | 11001010 |
| 11 | b | 00001011 | 75 | 4b | 01001011 | 139 | 8b | 10001011 | 203 | cb | 11001011 |
| 12 | c | 00001100 | 76 | 4c | 01001100 | 140 | 8c | 10001100 | 204 | cc | 11001100 |
| 13 | d | 00001101 | 77 | 4d | 01001101 | 141 | 8d | 10001101 | 205 | cd | 11001101 |
| 14 | e | 00001110 | 78 | 4e | 01001110 | 142 | 8e | 10001110 | 206 | ce | 11001110 |
| 15 | f | 00001111 | 79 | 4f | 01001111 | 143 | 8f | 10001111 | 207 | cf | 11001111 |
| 16 | 10 | 00010000 | 80 | 50 | 01010000 | 144 | 90 | 10010000 | 208 | d0 | 11010000 |
| 17 | 11 | 00010001 | 81 | 51 | 01010001 | 145 | 91 | 10010001 | 209 | d1 | 11010001 |
| 18 | 12 | 00010010 | 82 | 52 | 01010010 | 146 | 92 | 10010010 | 210 | d2 | 11010010 |
| 19 | 13 | 00010011 | 83 | 53 | 01010011 | 147 | 93 | 10010011 | 211 | d3 | 11010011 |
| 20 | 14 | 00010100 | 84 | 54 | 01010100 | 148 | 94 | 10010100 | 212 | d4 | 11010100 |
| 21 | 15 | 00010101 | 85 | 55 | 01010101 | 149 | 95 | 10010101 | 213 | d5 | 11010101 |
| 22 | 16 | 00010110 | 86 | 56 | 01010110 | 150 | 96 | 10010110 | 214 | d6 | 11010110 |
| 23 | 17 | 00010111 | 87 | 57 | 01010111 | 151 | 97 | 10010111 | 215 | d7 | 11010111 |
| 24 | 18 | 00011000 | 88 | 58 | 01011000 | 152 | 98 | 10011000 | 216 | d8 | 11011000 |
| 25 | 19 | 00011001 | 89 | 59 | 01011001 | 153 | 99 | 10011001 | 217 | d9 | 11011001 |
| 26 | 1a | 00011010 | 90 | 5a | 01011010 | 154 | 9a | 10011010 | 218 | da | 11011010 |
| 27 | 1b | 00011011 | 91 | 5b | 01011011 | 155 | 9b | 10011011 | 219 | db | 11011011 |
| 28 | 1c | 00011100 | 92 | 5c | 01011100 | 156 | 9c | 10011100 | 220 | dc | 11011100 |
| 29 | 1d | 00011101 | 93 | 5d | 01011101 | 157 | 9d | 10011101 | 221 | dd | 11011101 |
| 30 | 1e | 00011110 | 94 | 5e | 01011110 | 158 | 9e | 10011110 | 222 | de | 11011110 |
| 31 | 1f | 00011111 | 95 | 5f | 01011111 | 159 | 9f | 10011111 | 223 | df | 11011111 |
| 32 | 20 | 00100000 | 96 | 60 | 01100000 | 160 | a0 | 10100000 | 224 | e0 | 11100000 |
| 33 | 21 | 00100001 | 97 | 61 | 01100001 | 161 | a1 | 10100001 | 225 | e1 | 11100001 |
| 34 | 22 | 00100010 | 98 | 62 | 01100010 | 162 | a2 | 10100010 | 226 | e2 | 11100010 |
| 35 | 23 | 00100011 | 99 | 63 | 01100011 | 163 | a3 | 10100011 | 227 | e3 | 11100011 |
| 36 | 24 | 00100100 | 100 | 64 | 01100100 | 164 | a4 | 10100100 | 228 | e4 | 11100100 |
| 37 | 25 | 00100101 | 101 | 65 | 01100101 | 165 | a5 | 10100101 | 229 | e5 | 11100101 |
| 38 | 26 | 00100110 | 102 | 66 | 01100110 | 166 | a6 | 10100110 | 230 | e6 | 11100110 |
| 39 | 27 | 00100111 | 103 | 67 | 01100111 | 167 | a7 | 10100111 | 231 | e7 | 11100111 |
| 40 | 28 | 00101000 | 104 | 68 | 01101000 | 168 | a8 | 10101000 | 232 | e8 | 11101000 |
| 41 | 29 | 00101001 | 105 | 69 | 01101001 | 169 | a9 | 10101001 | 233 | e9 | 11101001 |
| 42 | 2a | 00101010 | 106 | 6a | 01101010 | 170 | aa | 10101010 | 234 | ea | 11101010 |
| 43 | 2b | 00101011 | 107 | 6b | 01101011 | 171 | ab | 10101011 | 235 | eb | 11101011 |
| 44 | 2c | 00101100 | 108 | 6c | 01101100 | 172 | ac | 10101100 | 236 | ec | 11101100 |
| 45 | 2d | 00101101 | 109 | 6d | 01101101 | 173 | ad | 10101101 | 237 | ed | 11101101 |
| 46 | 2e | 00101110 | 110 | 6e | 01101110 | 174 | ae | 10101110 | 238 | ee | 11101110 |
| 47 | 2f | 00101111 | 111 | 6f | 01101111 | 175 | af | 10101111 | 239 | ef | 11101111 |
| 48 | 30 | 00110000 | 112 | 70 | 01110000 | 176 | b0 | 10110000 | 240 | f0 | 11110000 |
| 49 | 31 | 00110001 | 113 | 71 | 01110001 | 177 | b1 | 10110001 | 241 | f1 | 11110001 |
| 50 | 32 | 00110010 | 114 | 72 | 01110010 | 178 | b2 | 10110010 | 242 | f2 | 11110010 |
| 51 | 33 | 00110011 | 115 | 73 | 01110011 | 179 | b3 | 10110011 | 243 | f3 | 11110011 |
| 52 | 34 | 00110100 | 116 | 74 | 01110100 | 180 | b4 | 10110100 | 244 | f4 | 11110100 |
| 53 | 35 | 00110101 | 117 | 75 | 01110101 | 181 | b5 | 10110101 | 245 | f5 | 11110101 |
| 54 | 36 | 00110110 | 118 | 76 | 01110110 | 182 | b6 | 10110110 | 246 | f6 | 11110110 |
| 55 | 37 | 00110111 | 119 | 77 | 01110111 | 183 | b7 | 10110111 | 247 | f7 | 11110111 |
| 56 | 38 | 00111000 | 120 | 78 | 01111000 | 184 | b8 | 10111000 | 248 | f8 | 11111000 |
| 57 | 39 | 00111001 | 121 | 79 | 01111001 | 185 | b9 | 10111001 | 249 | f9 | 11111001 |
| 58 | 3a | 00111010 | 122 | 7a | 01111010 | 186 | ba | 10111010 | 250 | fa | 11111010 |
| 59 | 3b | 00111011 | 123 | 7b | 01111011 | 187 | bb | 10111011 | 251 | fb | 11111011 |
| 60 | 3c | 00111100 | 124 | 7c | 01111100 | 188 | bc | 10111100 | 252 | fc | 11111100 |
| 61 | 3d | 00111101 | 125 | 7d | 01111101 | 189 | bd | 10111101 | 253 | fd | 11111101 |
| 62 | 3e | 00111110 | 126 | 7e | 01111110 | 190 | be | 10111110 | 254 | fe | 11111110 |
| 63 | 3f | 00111111 | 127 | 7f | 01111111 | 191 | bf | 10111111 | 255 | ff | 11111111 |