Source: https://courses.cs.washington.edu/courses/cse351/16au/lectures/CSE351-L02-binary_16au.pdf