Lecture 1

Intro & Number Systems

MCS 260 Fall 2021
David Dumas

 ✓ ✗

Types of work

Frequency Graded? Collaborate? Weekly No Yes! Weekly Yes No 4 times Yes No

Notice that all graded work is to be done individually.

Python

Python is a computer programming language.

• #2 most popular programming language in TIOBE
• Extensive use at Google, Dropbox, Instagram, Netflix, ...
• #1 most popular (by far) in a 2018 survey of data science / machine learning professionals (source)

Learning Python (version 3.6 or higher) is a key focus of MCS 260.

Most of our discussion of general computer science concepts will be based on the way they are seen and used in Python.

Python versions

In this course we only use Python 3.

The transition from Python 2 to Python 3 was a major milestone, with incompatible changes.

Python 2 support ended in January 1, 2020.

Number systems

Humans usually use the decimal number system, also known as base $10$.

In this system there is a $10^0=1$s place, a $10^1=10$s place, a $10^2=100$s place, etc.

There are $10$ digits with values $0, 1, \ldots, 9$.

In decimal, $312$ means: ${\color{red}3 \color{green} 1 \color{orange} 2} = {\color{red} 3} \times 10^2 + {\color{green} 1} \times 10^1 + {\color{orange} 2} \times 10^0$

For any whole number $b>1$ there is a number system called base $b$ where the place values are $b^0$, $b^1$, $b^2$, etc.

In base $b$ there are $b$ digits with values $0, 1, \ldots, b-1$.

In mathematics, it is common to use a subscript to indicate the base.

So $201_5$ means the base $5$ number with digits $2,0,1$.

$201_5$ is equal to the decimal number $51$: \begin{align} 201_5 &= 2 \times 5^2 + 0\times 5^1 + 1\times 5^0\\ &= 2\times 25 + 1 \times 1 = \boxed{51} \end{align}

In computer science, three non-decimal number systems are often encountered.

• Binary, or base $2$.
• Hexadecimal, or base $16$.
• Octal, or base $8$. (Least common.)

Binary

The digits are $0$ and $1$. A binary digit is called a bit.

The place values are $1$, $2$, $4$, $8$, $16$, etc.

Example: $1001_2$ means $1\times 8 + 0 \times 4 + 0 \times 2 + 1 \times 1 = 9$

In Python, binary numbers are indicated by preceding the digits with $\texttt{0b}$.

So the previous example would be written $\texttt{0b1001}$.

We can convert to binary using integer division and remainder.

Integer division
$x /\!/ 2$ means $x$ divided by $2$, discarding the remainer.
e.g. $7 /\!/ 2 = 3$,   $6 /\!/ 2 = 3$.

Remainder
$x \texttt{%} 2$ means the remainder when $x$ is divded by $2$. $7 \texttt{%}2 = 1$, $6 \texttt{%} 2 = 0$.

To convert a number to binary, just keep track of the remainders when you repeatedly integer-divide by $2$.

$x$$x /\!/ 2$$x \texttt{%} 2$
$312$$156$$\color{#F0F}0$
$156$$78$$\color{#F0E}0$
$78$$39$$\color{#F0C}0$
$39$$19$$\color{#F0A}1$
$19$$9$$\color{#F08}1$
$9$$4$$\color{#F06}1$
$4$$2$$\color{#F04}0$
$2$$1$$\color{#F02}0$
$1$$0$$\color{#F00}1$

So $312 = \texttt{0b}\color{#F00}{\texttt{1}}\color{#F02}{\texttt{0}}\color{#F04}{\texttt{0}}\color{#F06}{\texttt{1}}\color{#F08}{\texttt{1}}\color{#F0A}{\texttt{1}}\color{#F0C}{\texttt{0}}\color{#F0E}{\texttt{0}}\color{#F0F}{\texttt{0}}$, i.e. $312 = 256 + 32 + 16 + 8$.

Binary is not ideal for human consumption because of its low information density.

e.g. $9754 = \texttt{0b10011000011010}$.

Hexadecimal addresses this, giving a more condensed way of expressing a sequence of bits.

Hexadecimal or hex is a condensed representation of binary, with one symbol for each $4$-bit block.

Each $4$-bit block is just a number between $\texttt{0b0000}=0$ and $\texttt{0b1111}=15$. We use hex digits $0\ldots9$,$A \ldots F$:

 Digit Value Bit block 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0000 0001 0010 0011 0100 0101 0110 0111

 Digit Value Bit block 8 9 A B C D E F 8 9 10 11 12 13 14 15 1000 1001 1010 1011 1100 1101 1110 1111

Hexadecimal or hex is a condensed representation of binary, with one symbol for each $4$-bit block.

Each $4$-bit block is just a number between $\texttt{0b0000}=0$ and $\texttt{0b1111}=15$. We use hex digits $0\ldots9$,$A \ldots F$:

 Digit Value Bit block 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0000 0001 0010 0011 0100 0101 0110 0111

 Digit Value Bit block 8 9 A B C D E F 8 9 10 11 12 13 14 15 1000 1001 1010 1011 1100 1101 1110 1111

In Python notation, hexadecimal numbers begin with $\texttt{0x}$, followed by the digits.

So $\texttt{0x3e}$ means

 3 e 0011 1110 $\longrightarrow$ $\texttt{0b00111110} = 62$

Hexadecimal is also base $16$. Another way to see $\texttt{0x3e}$: \begin{align}\texttt{0x3e} &= \texttt{3} \times 16^1 + \texttt{e} \times 16^0 \\ &= 3 \times 16 + 14 \times 1 = 62 \end{align}

Aside: In decimal we sometimes separate groups of digits with punctuation for easier reading.

e.g. in the USA one million is often written "$1,\!000,\!000$".

In Python notation the underscore "$\texttt{_}$" can be used as a separator.

\begin{align}\texttt{0b1111_0100_0010_0100_0000} &= \texttt{0xf4240}\\ &= \texttt{1_000_000} \end{align}

When converting binary to hex, the number of bits may not be a multiple of $4$ at first. In this case we need to add some zeros on the left:

\begin{align} \texttt{0b10101} &= \texttt{0b}\color{gray}{\texttt{000}}\texttt{10101}\\ &= \texttt{0b}\color{red}{\texttt{0001}}\color{orange}{\texttt{0101}}\\ &= \texttt{0x}\color{red}{\texttt{1}}\color{orange}{\texttt{5}} \end{align}

(As in decimal, adding zeros on the left doesn't change the value.)

To convert a decimal number to hex, one way is to convert to binary and group bits.

An alternative is to repeatedly integer-divide by $16$ and use the remainders:

$x$$x /\!/ 16$$x \texttt{%} 16$
$62$$3$$\color{orange}{14}$
$3$$0$$\color{red}3$

Therefore $62 = \texttt{0x}\color{red}{\texttt{3}}\color{orange}{\texttt{e}}$

Octal

Octal or base $8$ is similar but we divide a binary number into blocks of $3$ bits, to using $0, \ldots, 7$ to represent blocks of $3$ bits.

In Python notation, octal numbers begin with $\texttt{0o}$ followed by the digits.

(That's numeral zero followed by lower case letter o.)

Example: $\texttt{0o775} = \texttt{0b111_111_101} = 509$

Octal is most commonly seen when setting file permissions on unix/Linux, where $9$ bits are naturally divided into $3$ groups of $3$.

e.g.

chmod 600 secrets.dat

Acknowledgements

• Some of today's lecture was based on teaching materials developed for MCS 260 by Jan Verschelde.

Revision history

• 2021-08-24 Fix colors on slide about converting 63 to hex.
• 2021-08-23 Update to reflect TA schedule change
• 2021-08-22 Initial publication