Hubbry Logo
HexadecimalHexadecimalMain
Open search
Hexadecimal
Community hub
Hexadecimal
logo
7 pages, 0 posts
0 subscribers
Be the first to start a discussion here.
Be the first to start a discussion here.
Hexadecimal
Hexadecimal
from Wikipedia

Hexadecimal (hex for short) is a positional numeral system for representing a numeric value as base 16. For the most common convention, a digit is represented as "0" to "9" like for decimal and as a letter of the alphabet from "A" to "F" (either upper or lower case) for the digits with decimal value 10 to 15.

As typical computer hardware is binary in nature and that hex is power of 2, the hex representation is often used in computing as a dense representation of binary information. A hex digit represents 4 contiguous bits – known as a nibble.[1] An 8-bit byte is two hex digits, such as 2C.

Special notation is often used to indicate that a number is hex. In mathematics, a subscript is typically used to specify the base. For example, the decimal value 491 would be expressed in hex as 1EB16. In computer programming, various notations are used. In C and many related languages, the prefix 0x is used. For example, 0x1EB.

Written representation

[edit]

Common convention

[edit]

Typically, a hex representation convention allows either lower or upper case letters and treats the letter the same regardless of its case.

Often when rendering non-textual data, a value stored in memory is displayed as a sequence of hex digits with spaces that between values. For instance, in the following hex dump, each 8-bit byte is a 2-digit hex number, with spaces between them, while the 32-bit offset at the start is an 8-digit hex number.

00000000  57 69 6B 69 70 65 64 69  61 2C 20 74 68 65 20 66 
00000010  72 65 65 20 65 6E 63 79  63 6C 6F 70 65 64 69 61 
00000020  20 74 68 61 74 20 61 6E  79 6F 6E 65 20 63 61 6E
00000030  20 65 64 69 74 2C 20 69  6E 63 6C 75 64 69 6E 67
00000040  20 79 6F 75 20 28 61 6E  64 20 6D 65 29 21

Identification

[edit]

There are several conventions for expressing that a number is represented as hex.

  • A decimal subscript can give the base explicitly. For example 15910 indicates decimal 159, 15916 indicates hex 159. Some prefer a text subscript, such as 159decimal and 159hex, or 159d and 159h
  • In C and many languages influenced by it, the prefix 0x indicates that the numeric literal after it is in hex, a character of a string or character literal can be expressed as hex with the prefix \x (for example '\x1B' represents the Esc control character) and to output an integer as hex via printf-like function, the format conversion code %X or %x is used
  • In URIs (including URLs), character codes are written as hex pairs prefixed with %: http://www.example.com/name%20with%20spaces where %20 is the code for the space (blank) character, ASCII code point 20 in hex, 32 in decimal.
  • In XML and XHTML, a character can be expressed as a hex numeric character reference using the notation &#xcode;, for instance T represents the character U+0054 (the uppercase letter "T"). If there is no x the number is decimal (thus T is the same character).[2]
  • In Intel-derived assembly languages and Modula-2,[3] hex is denoted with a suffixed H or h: FFh or 05A3H. Some implementations require a leading zero when the first hex digit character is not a decimal digit, so one would write 0FFh instead of FFh. Some other implementations (such as NASM) allow C-style numbers (0x42)
  • Some assembly languages (Microchip) use the notation H'ABCD' (for ABCD16); similarly, Fortran 95 uses Z'ABCD'
  • Ada and VHDL enclose hex numerals in based "numeric quotes": 16#5A3#, 16#C1F27ED#. For bit vector constants VHDL uses the notation x"5A3", x"C1F27ED".[4]
  • Verilog represents hex constants in the form 8'hFF, where 8 is the number of bits in the value and FF is the hex constant
  • Common Lisp uses the prefixes #x and #16r. Setting the variables *read-base*[5] and *print-base*[6] to 16 can also be used to switch the reader and printer of a Common Lisp system to hex representation for reading and printing numbers. Thus hex numbers can be represented without the #x or #16r prefix code, when the input or output base has been changed to 16.
  • TI-89 and 92 series uses a 0h prefix: 0h5A3, 0hC1F27ED
  • ALGOL 68 uses the prefix 16r to denote hex numbers: 16r5a3, 16rC1F27ED. Binary, quaternary (base-4), and octal numbers can be specified similarly.
  • The most common format for hex on IBM mainframes (zSeries) and midrange computers (IBM i) running the traditional OS's (zOS, zVSE, zVM, TPF, IBM i) is X'5A3' or X'C1F27ED', and is used in Assembler, PL/I, COBOL, JCL, scripts, commands and other places. This format was common on other (and now obsolete) IBM systems as well. Occasionally quotation marks were used instead of apostrophes.

Implicit

[edit]

In some contexts, a number is always written as hex, and therefore, needs no identification notation.

  • Color references in HTML, CSS and X Window can be expressed with six hex digits (two each for the red, green and blue components, in that order) prefixed with #: magenta, for example, is represented as #FF00FF.[10] CSS also allows 3-hexdigit abbreviations with one hexdigit per component: #FA3 abbreviates #FFAA33 (a golden orange:  ).
  • In MIME (e-mail extensions) quoted-printable encoding, character codes are written as hex pairs prefixed with =: Espa=F1a is "España" (F1hex is the code for ñ in the ISO/IEC 8859-1 character set).[11])
  • PostScript binary data (such as image pixels) can be expressed as unprefixed consecutive hex pairs: AA213FD51B3801043FBC ...
  • Any IPv6 address can be written as eight groups of four hex digits (sometimes called hextets), where each group is separated by a colon (:). This, for example, is a valid IPv6 address: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 or abbreviated by removing leading zeros as 2001:db8:85a3::8a2e:370:7334 (IPv4 addresses are usually written in decimal).
  • Globally unique identifiers are written as thirty-two hex digits, often in unequal hyphen-separated groupings, for example 3F2504E0-4F89-41D3-9A0C-0305E82C3301.

Alternative symbols

[edit]
Bruce Alan Martin's hex notation proposal[12]
Ronald O. Whitaker's hex notation proposal.[13][14]

Notable other hexadecimal representations that use symbols other than letters "A" through "F" to represent the digits above 9 include:

  • During the 1950s, some installations, such as Bendix-14, favored using the digits 0 through 5 with an overline to denote the values 10–15 as 0, 1, 2, 3, 4 and 5.
  • The ORDVAC and ILLIAC I (1952) computers (and some derived designs, e.g. BRLESC) used the uppercase letters K, S, N, J, F and L for the values 10 to 15.[17][15]
  • The Librascope LGP-30 (1956) used the letters F, G, J, K, Q and W for the values 10 to 15.[18][15]
  • On the PERM (1956) computer, hex numbers were written as letters O for zero, A to N and P for 1 to 15. Many machine instructions had mnemonic hex-codes (A=add, M=multiply, L=load, F=fixed-point etc.); programs were written without instruction names.[19]
  • The Honeywell Datamatic D-1000 (1957) used the lowercase letters b, c, d, e, f, and g whereas the Elbit 100 (1967) used the uppercase letters B, C, D, E, F and G for the values 10 to 15.[15]
  • The Monrobot XI (1960) used the letters S, T, U, V, W and X for the values 10 to 15.[15]
  • The NEC parametron computer NEAC 1103 (1960) used the letters D, G, H, J, K (and possibly V) for values 10–15.[20]
  • Bruce Alan Martin of Brookhaven National Laboratory considered the choice of A–F "ridiculous". In a 1968 letter to the editor of the CACM, he proposed an entirely new set of symbols based on the bit locations.[12]
  • In 1972, Ronald O. Whitaker of Rowco Engineering Co. proposed a triangular font that allows "direct binary reading" to "permit both input and output from computers without respect to encoding matrices."[13][14]
  • Some seven-segment display decoder chips (i.e., 74LS47) show unexpected output due to logic designed only to produce 0–9 correctly.[21]

Sign

[edit]

The hex system can express negative numbers the same way as in decimal, by putting a minus sign (−) before the number to indicate that it is negative.

Bit pattern

[edit]

Hex can express the bit pattern in a processor, so a sequence of hex digits may represent a signed or even a floating-point value. This way, the negative number −4210 can be written as FFFF FFD6 in a 32-bit CPU register (in two's complement), as C228 0000 in a 32-bit FPU register or C045 0000 0000 0000 in a 64-bit FPU register (in the IEEE floating-point standard).

Exponential notation

[edit]

Just as decimal numbers can be represented in exponential notation, so too can hex numbers. P notation uses the letter P (or p, for "power"), whereas E (or e) serves a similar purpose in decimal E notation. The number after the P is decimal and represents the binary exponent. Increasing the exponent by 1 multiplies by 2, not 16: 20p0 = 10p1 = 8p2 = 4p3 = 2p4 = 1p5. Usually, the number is normalized so that the hex digits start with 1. (zero is usually 0 with no P).

Example: 1.3DEp42 represents 1.3DE16 × 24210.

P notation is required by the IEEE 754-2008 binary floating-point standard and can be used for floating-point literals in the C99 edition of the C programming language.[22] Using the %a or %A conversion specifiers, this notation can be produced by implementations of the printf family of functions following the C99 specification[23] and Single Unix Specification (IEEE Std 1003.1) POSIX standard.[24]

Verbal representation

[edit]
Hex finger-counting scheme

Since there were no traditional numerals to represent the quantities from ten to fifteen, alphabetic letters were re-employed as a substitute. Most European languages lack non-decimal-based words for some of the numerals eleven to fifteen. Some people read hex numbers digit by digit, like a phone number, or using the NATO phonetic alphabet, the Joint Army/Navy Phonetic Alphabet, or a similar ad-hoc system. In the wake of the adoption of hex among IBM System/360 programmers, Magnuson (1968)[25] suggested a pronunciation guide that gave short names to the letters of hex – for instance, "A" was pronounced "ann", B "bet", C "chris", etc.[25] Another naming-system was published online by Rogers (2007)[26] that tries to make the verbal representation distinguishable in any case, even when the actual number does not contain numbers A–F. Examples are listed in the tables below. Yet another naming system was elaborated by Babb (2015), based on a joke in Silicon Valley.[27] The system proposed by Babb was further improved by Atkins-Bittner in 2015-2016.[28]

Others have proposed using the verbal Morse code conventions to express four-bit hex digits, with "dit" and "dah" representing zero and one, respectively, so that "0000" is voiced as "dit-dit-dit-dit" (....), dah-dit-dit-dah (-..-) voices the digit with a value of nine, and "dah-dah-dah-dah" (----) voices the hex digit for decimal 15.

Systems of counting on digits have been devised for both binary and hex. Arthur C. Clarke suggested using each finger as an on/off bit, allowing finger counting from zero to 102310 on ten fingers.[29] Another system for counting up to FF16 (25510) is illustrated on the right.

Magnuson (1968)[25]
naming method
Hex Name Decimal
A ann 10
B bet 11
C chris 12
D dot 13
E ernest 14
F frost 15
1A annteen 26
A0 annty 160
5B fifty bet 91
A,01C annty
christeen
40,990
1,AD0 annteen
dotty
6,864
3,A7D thirty ann
seventy dot
14,973
Rogers (2007)[26]
naming method
Hex Name Decimal
A ten 10
B eleven 11
C twelve 12
D draze 13
E eptwin 14
F fim 15
10 tex 16
11 oneteek 17
1F fimteek 31
50 fiftek 80
C0 twelftek 192
100 hundrek 256
1,000 thousek 4,096
3E thirtek eptwin 62
E1 eptek one 225
C4A twelve hundrek
fourtek ten
3,146
1,743 one thousek
seven hundrek
fourtek three
5,955
Atkins-Bittner (2015)[28]
naming method
Hex Name Decimal
A ae 10
B bee 11
C cee 12
D dee 13
E ee 14
F eff 15
A0 atta 160
B0 bitta 176
C0 citta 192
D0 dickety 208
E0 eckity 224
F0 fleventy 240
1A abteen 26
1B bibteen 27
1C cibteen 28
1D dibbleteen 29
1E ebbleteen 30
1F fleventeen 31
100 one bitey 256
10,000 one millby 65,536
100,000,000 one billby 4,294,967,296

Conversion

[edit]

Binary conversion

[edit]
The programmable RPN-calculator HP-16C Computer Scientist from 1982 was designed for programmers. One of its key features was the conversion between different numeral systems (note hex number in display).

Most computers manipulate binary data, but it is difficult for humans to work with a large number of digits for even a relatively small binary number. Although most humans are familiar with the base 10 system, it is much easier to map binary to hex than to decimal because each hex digit maps to a whole number of bits (410). This example converts 11112 to base ten. Since each position in a binary numeral can contain either a 1 or a 0, its value may be easily determined by its position from the right:

  • 00012 = 110
  • 00102 = 210
  • 01002 = 410
  • 10002 = 810

Therefore:

11112 = 810 + 410 + 210 + 110
  = 1510

With little practice, mapping 11112 to F16 in one step becomes easy. The advantage of using hex rather than decimal increases rapidly with the size of the number. When the number becomes large, conversion to decimal is very tedious. However, when mapping to hex, it is trivial to regard the binary string as 4-digit groups and map each to a single hex digit.[30]

This example shows the conversion of a binary number to decimal, mapping each digit to the decimal value, and adding the results.

(1001011100)2 = 51210 + 6410 + 1610 + 810 + 410
  = 60410

Compare this to the conversion to hex, where each group of four digits can be considered independently and converted directly:

(1001011100)2 = 0010  0101  11002
  = 2 5 C16
  = 25C16

The conversion from hex to binary is equally direct.[30]

Other simple conversions

[edit]

Although quaternary (base 4) is little used, it can easily be converted to and from hex or binary. Each hex digit corresponds to a pair of quaternary digits, and each quaternary digit corresponds to a pair of binary digits. In the above example 2 5 C16 = 02 11 304.

The octal (base 8) system can also be converted with relative ease, although not quite as trivially as with bases 2 and 4. Each octal digit corresponds to three binary digits, rather than four. Therefore, we can convert between octal and hex via an intermediate conversion to binary followed by regrouping the binary digits in groups of either three or four.

Division-remainder in source base

[edit]

As with all bases there is a simple algorithm for converting a representation of a number to hex by doing integer division and remainder operations in the source base. In theory, this is possible from any base, but for most humans, only decimal and for most computers, only binary (which can be converted by far more efficient methods) can be easily handled with this method.

Let d be the number to represent in hex, and the series hihi−1...h2h1 be the hex digits representing the number.

  1. i ← 1
  2. hi ← d mod 16
  3. d ← (d − hi) / 16
  4. If d = 0 (return series hi) else increment i and go to step 2

"16" may be replaced with any other base that may be desired.

The following is a JavaScript implementation of the above algorithm for converting any number to a hex in String representation. Its purpose is to illustrate the above algorithm. To work with data seriously, however, it is much more advisable to work with bitwise operators.

function toHex(d) {
  var r = d % 16;
  if (d - r == 0) {
    return toChar(r);
  }
  return toHex((d - r) / 16) + toChar(r);
}

function toChar(n) {
  const alpha = "0123456789ABCDEF";
  return alpha.charAt(n);
}

Conversion through addition and multiplication

[edit]
A hex multiplication table

It is also possible to make the conversion by assigning each place in the source base the hex representation of its place value — before carrying out multiplication and addition to get the final representation. For example, to convert the number B3AD to decimal, one can split the hex number into its digits: B (1110), 3 (310), A (1010) and D (1310), and then get the final result by multiplying each decimal representation by 16p (p being the corresponding hex digit position, counting from right to left, beginning with 0). In this case, we have that:

B3AD = (11 × 163) + (3 × 162) + (10 × 161) + (13 × 160)

which is 45997 in base 10.

Tools for conversion

[edit]

Many computer systems provide a calculator utility capable of performing conversions between the various radices frequently including hex.

In Microsoft Windows, the Calculator, on its Programmer mode, allows conversions between hex and other common programming bases.

Elementary arithmetic

[edit]

Elementary operations such as division can be carried out indirectly through conversion to an alternate numeral system, such as the commonly used decimal system or the binary system where each hex digit corresponds to four binary digits.

Alternatively, one can also perform elementary operations directly within the hex system itself — by relying on its addition/multiplication tables and its corresponding standard algorithms such as long division and the traditional subtraction algorithm.

Real numbers

[edit]

Rational numbers

[edit]

As with other numeral systems, the hex system can be used to represent rational numbers, although repeating expansions are common since sixteen (1016) has only a single prime factor: two.

For any base, 0.1 (or "1/10") is always equivalent to one divided by the representation of that base value in its own number system. Thus, whether dividing one by two for binary or dividing one by sixteen for hex, both of these fractions are written as 0.1. Because the radix 16 is a perfect square (42), fractions expressed in hex have an odd period much more often than decimal ones, and there are no cyclic numbers (other than trivial single digits). Recurring digits are exhibited when the denominator in lowest terms has a prime factor not found in the radix; thus, when using hex notation, all fractions with denominators that are not a power of two result in an infinite string of recurring digits (such as thirds and fifths). This makes hex (and binary) less convenient than decimal for representing rational numbers since a larger proportion lies outside its range of finite representation.

All rational numbers finitely representable in hex are also finitely representable in decimal, duodecimal and sexagesimal: that is, any hex number with a finite number of digits also has a finite number of digits when expressed in those other bases. Conversely, only a fraction of those finitely representable in the latter bases are finitely representable in hex. For example, decimal 0.1 corresponds to the infinite recurring representation 0.19 in hex. However, hex is more efficient than duodecimal and sexagesimal for representing fractions with powers of two in the denominator. For example, 0.062510 (one-sixteenth) is equivalent to 0.116, 0.0912, and 0;3,4560.

n Decimal
Prime factors of: base, b = 10: 2, 5;
b − 1 = 9: 3;
b + 1 = 11: 11
Hexadecimal
Prime factors of: base, b = 1610 = 10: 2; b − 1 = 1510 = F: 3, 5; b + 1 = 1710 = 11: 11
Reciprocal Prime factors Positional representation
(decimal)
Positional representation
(hex)
Prime factors Reciprocal
2 1/2 2 0.5 0.8 2 1/2
3 1/3 3 0.3333... = 0.3 0.5555... = 0.5 3 1/3
4 1/4 2 0.25 0.4 2 1/4
5 1/5 5 0.2 0.3 5 1/5
6 1/6 2, 3 0.16 0.2A 2, 3 1/6
7 1/7 7 0.142857 0.249 7 1/7
8 1/8 2 0.125 0.2 2 1/8
9 1/9 3 0.1 0.1C7 3 1/9
10 1/10 2, 5 0.1 0.19 2, 5 1/A
11 1/11 11 0.09 0.1745D B 1/B
12 1/12 2, 3 0.083 0.15 2, 3 1/C
13 1/13 13 0.076923 0.13B D 1/D
14 1/14 2, 7 0.0714285 0.1249 2, 7 1/E
15 1/15 3, 5 0.06 0.1 3, 5 1/F
16 1/16 2 0.0625 0.1 2 1/10
17 1/17 17 0.0588235294117647 0.0F 11 1/11
18 1/18 2, 3 0.05 0.0E38 2, 3 1/12
19 1/19 19 0.052631578947368421 0.0D79435E5 13 1/13
20 1/20 2, 5 0.05 0.0C 2, 5 1/14
21 1/21 3, 7 0.047619 0.0C3 3, 7 1/15
22 1/22 2, 11 0.045 0.0BA2E8 2, B 1/16
23 1/23 23 0.0434782608695652173913 0.0B21642C859 17 1/17
24 1/24 2, 3 0.0416 0.0A 2, 3 1/18
25 1/25 5 0.04 0.0A3D7 5 1/19
26 1/26 2, 13 0.0384615 0.09D8 2, D 1/1A
27 1/27 3 0.037 0.097B425ED 3 1/1B
28 1/28 2, 7 0.03571428 0.0924 2, 7 1/1C
29 1/29 29 0.0344827586206896551724137931 0.08D3DCB 1D 1/1D
30 1/30 2, 3, 5 0.03 0.08 2, 3, 5 1/1E
31 1/31 31 0.032258064516129 0.08421 1F 1/1F
32 1/32 2 0.03125 0.08 2 1/20
33 1/33 3, 11 0.03 0.07C1F 3, B 1/21
34 1/34 2, 17 0.02941176470588235 0.078 2, 11 1/22
35 1/35 5, 7 0.0285714 0.075 5, 7 1/23
36 1/36 2, 3 0.027 0.071C 2, 3 1/24
37 1/37 37 0.027 0.06EB3E453 25 1/25
38 1/38 2, 19 0.02631578947368421 0.0435E50D79435E4AC62B4 2, 13 1/26
39 1/39 3, 13 0.0256410 0.069 3, D 1/27
40 1/40 2, 5 0.025 0.06 2, 5 1/28
41 1/41 41 0.02439 0.063E9538D283B5B62FB8 29 1/29
42 1/42 2, 3, 7 0.0238095 0.0618 2, 3, 7 1/2A
43 1/43 43 0.023255813953488372093 0.05F417D 2B 1/2B
44 1/44 2, 11 0.0227 0.05D1745 2, B 1/2C
45 1/45 3, 5 0.02 0.05B 3, 5 1/2D
46 1/46 2, 23 0.02173913043478765869567 0.0590B21642C9C4EF44A9 2, 17 1/2E
47 1/47 47 0.0212765957446808510638297872340425531914893617 0.0572620AE4C415C9882B931 2F 1/2F
48 1/48 2, 3 0.02083 0.05 2, 3 1/30

Irrational numbers

[edit]

The table below gives the expansions of some common irrational numbers in decimal and hex.

Number Positional representation
Decimal Hex
√2 (the length of the diagonal of a unit square) 1.414213562373095048... 1.6A09E667F3BCD...
√3 (the length of the diagonal of a unit cube) 1.732050807568877293... 1.BB67AE8584CAA...
√5 (the length of the diagonal of a 1×2 rectangle) 2.236067977499789696... 2.3C6EF372FE95...
φ (phi, the golden ratio = (1+5)/2) 1.618033988749894848... 1.9E3779B97F4A...
π (pi, the ratio of circumference to diameter of a circle) 3.141592653589793238462643
383279502884197169399375105...
3.243F6A8885A308D313198A2E0
3707344A4093822299F31D008...
e (the base of the natural logarithm) 2.718281828459045235... 2.B7E151628AED2A6B...
τ (the Thue–Morse constant) 0.412454033640107597... 0.6996 9669 9669 6996...
γ (the limiting difference between the harmonic series and the natural logarithm) 0.577215664901532860... 0.93C467E37DB0C7A4D1B...

Powers

[edit]

The first 16 powers of 2 are below as hex to show relative simplicity compared to decimal representation.

2x Hex Decimal
20 1 1
21 2 2
22 4 4
23 8 8
24 10 16
25 20 32
26 40 64
27 80 128
28 100 256
29 200 512
210 400 1,024
211 800 2,048
212 1,000 4,096
213 2,000 8,192
214 4,000 16,384
215 8,000 32,768
216 10,000 65,536

Cultural history

[edit]

The traditional Chinese units of measurement were base-16. For example, one jīn (斤) in the old system equals sixteen taels. The suanpan (Chinese abacus) can be used to perform hex calculations such as additions and subtractions.[31]

As with the duodecimal system, there have been occasional attempts to promote hex as the preferred numeral system. These attempts often propose specific pronunciation and symbols for the individual numerals.[32] Some proposals unify standard measures so that they are multiples of 16.[33][34] An early such proposal was put forward by John W. Nystrom in Project of a New System of Arithmetic, Weight, Measure and Coins: Proposed to be called the Tonal System, with Sixteen to the Base, published in 1862.[35] Nystrom among other things suggested hexadecimal time, which subdivides a day by 16, so that there are 16 "hours" (or "10 tims", pronounced tontim) in a day.[36]

The word hexadecimal is first recorded in 1952.[37] It is macaronic in the sense that it combines Greek ἕξ (hex) "six" with Latinate -decimal. The all-Latin alternative sexadecimal (compare the word sexagesimal for base 60) is older, and sees at least occasional use from the late 19th century.[38] It is still in use in the 1950s in Bendix documentation. Schwartzman (1994) argues that use of sexadecimal may have been avoided because of its suggestive abbreviation to sex.[39] Many western languages since the 1960s have adopted terms equivalent in formation to hexadecimal (e.g. French hexadécimal, Italian esadecimale, Romanian hexazecimal, Serbian хексадецимални, etc.) but others have introduced terms which substitute native words for "sixteen" (e.g. Greek δεκαεξαδικός, Icelandic sextándakerfi, Russian шестнадцатеричной etc.)

Terminology and notation did not become settled until the end of the 1960s. In 1969, Donald Knuth argued that the etymologically correct term would be senidenary, or possibly sedenary, a Latinate term intended to convey "grouped by 16" modelled on binary, ternary, quaternary, etc. According to Knuth's argument, the correct terms for decimal and octal arithmetic would be denary and octonary, respectively.[40] Alfred B. Taylor used senidenary in his mid-1800s work on alternative number bases, although he rejected base 16 because of its "incommodious number of digits".[41][42]

The now-current notation using the letters A to F establishes itself as the de facto standard beginning in 1966, in the wake of the publication of the Fortran IV manual for IBM System/360, which (unlike earlier variants of Fortran) recognizes a standard for entering hexadecimal constants.[43] As noted above, alternative notations were used by NEC (1960) and The Pacific Data Systems 1020 (1964). The standard adopted by IBM seems to have become widely adopted by 1968, when Bruce Alan Martin in his letter to the editor of the CACM complains that

With the ridiculous choice of letters A, B, C, D, E, F as hexadecimal number symbols adding to already troublesome problems of distinguishing octal (or hex) numbers from decimal numbers (or variable names), the time is overripe for reconsideration of our number symbols. This should have been done before poor choices gelled into a de facto standard!

Martin's argument was that use of numerals 0 to 9 in nondecimal numbers "imply to us a base-ten place-value scheme": "Why not use entirely new symbols (and names) for the seven or fifteen nonzero digits needed in octal or hex. Even use of the letters A through P would be an improvement, but entirely new symbols could reflect the binary nature of the system".[12] He also argued that "re-using alphabetic letters for numerical digits represents a gigantic backward step from the invention of distinct, non-alphabetic glyphs for numerals sixteen centuries ago" (as Brahmi numerals, and later in a Hindu–Arabic numeral system), and that the recent ASCII standards (ASA X3.4-1963 and USAS X3.4-1968) "should have preserved six code table positions following the ten decimal digits -- rather than needlessly filling these with punctuation characters" (":;<=>?") that might have been placed elsewhere among the 128 available positions.

Base16

[edit]

Base16 is a binary to text encoding in the family that also contains Base32, Base58, and Base64. Data is broken into 4-bit sequences, and each value (0-15) is encoded as a character. Although any 16 characters could be used, in practice, the ASCII digits "0"–"9" and letters "A"–"F" (or "a"–"f") are used to align with the typical notation for hex numbers.

Support for Base16 encoding is ubiquitous in modern computing. It is the basis for the W3C standard for URL percent encoding, where a character is replaced with a percent sign "%" and its Base16-encoded form. Most modern programming languages directly include support for formatting and parsing Base16-encoded numbers.

Advantages of Base16 encoding include:

  • Most programming languages have facilities to parse ASCII-encoded hex
  • Being exactly half a byte, 4-bits is easier to process than the 5 or 6 bits of Base32 and Base64, respectively
  • The notation is well-known; easily understood without needing a symbol lookup table
  • Many CPU architectures have dedicated instructions that allow access to a half-byte (aka nibble), making it more efficient in hardware than Base32 and Base64

Disadvantages include:

  • Space efficiency is only 50%, since each 4-bit value from the original data will be encoded as an 8-bit byte; in contrast, Base32 and Base64 encodings have a space efficiency of 63% and 75% respectively
  • Complexity of accepting both upper and lower case letters

See also

[edit]

References

[edit]
Revisions and contributorsEdit on WikipediaRead on Wikipedia
from Grokipedia
Hexadecimal is a positional numeral system with a base of 16, utilizing the symbols 0–9 to represent values zero through nine and the letters to represent values ten through fifteen. This system allows each digit to signify a power of 16, enabling compact encoding of numerical data compared to binary or representations. The origins of hexadecimal trace back to the 17th century, when explored base-16 notations, though the modern term "hexadecimal" emerged in 1950 during the development of the SEAC computer by the U.S. National Bureau of Standards, which standardized the digits 0–9 and A–F. Earlier proposals, such as Thomas Wright Hill's "sexdecimal" in 1845 and John William Nystrom's "tonal" system in 1862, laid groundwork for base-16 counting, but widespread adoption occurred with mid-20th-century computing advancements. In and digital , hexadecimal serves as a concise intermediary for , where each hex digit corresponds to four binary bits (a ), facilitating tasks like memory addressing, representation, and error reduction in programming. It is prominently applied in for color codes (e.g., #FF0000 for ), network protocols such as , and low-level hardware debugging. Conversions between hexadecimal, binary, and rely on place-value by powers of 16 or repeated division, underscoring its utility in technical fields.

Fundamentals

Definition and Properties

Hexadecimal is a with a of 16, employing 16 distinct symbols to represent numerical values from to 15 in each digit position. This extends the system's 10 digits (0-9) by incorporating six additional symbols, typically letters, to denote values 10 through 15. In hexadecimal notation, the position of each digit determines its place value as a power of 16, with the rightmost digit representing 160=116^0 = 1 and each subsequent digit to the left multiplying by successively higher powers of 16. The overall value of a hexadecimal number dndn1d1d0d_n d_{n-1} \dots d_1 d_0 is calculated as the weighted sum of its digits: i=0ndi16i\sum_{i=0}^{n} d_i \cdot 16^i where each did_i is an integer from 0 to 15, and nn is the degree of the highest power of 16 needed. A key property of hexadecimal is its compact representation of binary data, as each hexadecimal digit encodes exactly four binary digits (bits), given that 16=2416 = 2^4. This one-to-four correspondence reduces the length of representations for large numbers compared to pure binary strings, while also being more concise than decimal for certain computing contexts involving powers of two. Base-16 is particularly practical in digital systems because it aligns directly with binary architecture, facilitating efficient grouping of bits—such as into 8-bit bytes, which require only two hexadecimal digits—without the misalignment issues of non-power-of-2 bases like decimal.

Digits and Symbols

Hexadecimal digits represent values from to 15 using a set of sixteen symbols. The numerals through 9 denote the values to 9, while the letters A, B, C, D, E, and F represent the values 10, 11, 12, 13, 14, and 15, respectively. Lowercase letters a through f serve as equivalent variants for these higher values and are widely accepted in practice. Historically, the choice of letters A-F was not universal in early ; some systems employed alternative glyphs for digits beyond 9, such as U, V, W, X, Y, and Z on the SWAC computer at UCLA during the and . Other proposals have suggested non-letter symbols for higher digits to avoid confusion with alphanumeric text, but these remain rare and have not been adopted in standard usage. To identify hexadecimal numbers in programming and documentation, various prefixes and suffixes are employed. In languages like C and its derivatives, the prefix 0x (or 0X) precedes the digits, as standardized in the C programming language specification. Some assemblers, such as those from Motorola, use a $ prefix, while Intel-style assemblers append an H (or h) suffix. In contexts like HTML and CSS color codes, hexadecimal values are implicit without a prefix, typically following a # symbol and consisting of three or six digits. Hexadecimal notation exhibits no universal standard for , though it is case-insensitive in most parsers and interpreters, allowing both uppercase A-F and lowercase a-f interchangeably. Uppercase letters are preferred in formal and for clarity and tradition, whereas lowercase variants predominate in source code and informal contexts to align with common programming conventions.

Representation

Written Conventions

Hexadecimal numbers are typically written without spaces or commas between digits to maintain compactness, though for enhanced readability in lengthy representations, digits are often grouped into sets of four starting from the right, separated by spaces, such as 1A2B 3C4D for the number 1A2B3C4D. To distinguish hexadecimal from decimal numbers, explicit prefixes like 0x (common in languages such as C and Java) or suffixes like h (used in assembly and some documentation) are employed, for example, 0xFF or FFh; in programming contexts where the base is unambiguous, such identifiers may be omitted. Although hexadecimal primarily represents unsigned values, negative numbers are conventionally denoted by prefixing a minus sign to the hexadecimal representation, such as -0x10, while in binary two's complement contexts, the sign is handled through bit patterns without altering the hexadecimal notation itself. Each hexadecimal digit serves as a shorthand for a four-bit binary nibble, allowing compact representation of binary data; for instance, the digit A corresponds to the binary pattern 1010.

Verbal Description

Hexadecimal numbers are typically pronounced digit by digit, reading from left to right in a manner similar to reciting a sequence of individual characters, without applying decimal-style positional modifiers such as "teen" or "ty" endings. The digits 0 through 9 are named using cardinal numbers: zero, one, two, three, four, five, six, seven, eight, and nine. The additional digits A through F, representing values 10 to 15, are pronounced according to their English letter names: ay, , see, dee, , and eff. In certain technical contexts, particularly those involving clear audio communication like radio or telephony in computing and engineering, the NATO phonetic alphabet may be employed for the letters to minimize ambiguity: alpha for A, bravo for B, charlie for C, delta for D, echo for E, and foxtrot for F. For instance, the hexadecimal value 1A3 might be verbalized as "one ay three hex," "one alpha three hexadecimal," or simply "one A three in hex" to specify the base and prevent confusion with decimal equivalents. The abbreviation "hex" is commonly used in speech for brevity, especially among programmers and engineers. While English conventions dominate in global discussions, adaptations exist in other languages where letter pronunciations align with local phonetic norms. For example, in French, the digit A is often pronounced as "a" (like "ah") and B as "bé," reflecting alphabet recitation, with the overall number read digit by digit followed by "hexadécimal."

Special Notations

Hexadecimal notation extends beyond standard representations to handle large or small values and signed numbers through specialized formats. Exponential notation, akin to in , is useful for compactly representing very large or small quantities in and contexts. In floating-point representations standardized by IEEE 754, hexadecimal exponential notation uses a binary exponent but is often displayed with a hexadecimal mantissa and a decimal exponent scaled to powers of 2. A common format in programming is 0xM.PpN, where M is the integer mantissa in hex, P the fractional part, and N the decimal exponent for 2^N; for example, 0x1.0p4 equals 16 in decimal (1 × 2^4). This syntax, introduced in the C99 standard, enables exact binary floating-point literals without intermediate decimal conversions, reducing rounding errors in numerical computations. Signed hexadecimal representations go beyond prefixing a minus sign for negatives, particularly in computing where encoding is prevalent for efficient arithmetic. In , a is formed by inverting all bits of its positive counterpart and adding one, then expressing the result in hexadecimal digits. For an 8-bit system, -5 () is FB in hexadecimal, as the binary 00000101 inverts to 11111010 and adding one yields 11111011. This method allows seamless addition and subtraction of signed values on hardware without separate positive/negative logic. One's complement, an older alternative, inverts bits without adding one (e.g., -5 as FA hex), but it is less common today due to issues like double zero representations. In software tools and calculators supporting hexadecimal mode, implicit exponential notation often appears for floating-point or overflow values, displaying large hex numbers in scientific-like form (e.g., 1.234E+10h) to manage screen limitations. Modern scientific calculators, such as models, handle hex inputs but switch to exponential display for results exceeding fixed-digit capacity, integrating base-16 with standard E-notation for readability during conversions or computations.

Conversion Methods

To and From Decimal

To convert a positive from to hexadecimal, apply the repeated by 16: divide the number by 16, record the as the next least significant digit (converting values 10-15 to A-F), and continue with the quotient until it reaches zero; the hexadecimal representation is then the remainders read from last to first. This method leverages the base-16 structure, where each directly yields a valid hexadecimal digit. For example, convert 255 from to hexadecimal: Reading upward gives FF in hexadecimal, equivalent to 255 in . To convert from hexadecimal to , expand the number using : multiply each digit's value (0-9 as is, A=10, B=11, C=12, D=13, E=14, F=15) by 16 raised to the power of its position from the right (starting at position 0), then sum the products. The general formula for a hexadecimal number with digits dndn1d1d0d_n d_{n-1} \dots d_1 d_0 is: k=0ndk×16k=dn×16n+dn1×16n1++d1×161+d0×160\sum_{k=0}^{n} d_k \times 16^k = d_n \times 16^n + d_{n-1} \times 16^{n-1} + \dots + d_1 \times 16^1 + d_0 \times 16^0 For the example FF in hexadecimal:
  • F (15) × 16¹ + F (15) × 16⁰ = 15 × 16 + 15 × 1 = 240 + 15 = 255 in .
For large integers beyond manual feasibility, such as those exceeding typical limits, programming languages handle the conversions efficiently using built-in functions; for instance, Python's arbitrary-precision integers support the hex() method on int objects to produce hexadecimal strings via the same algorithmic principles. Special cases include zero, which represents as 0 in both bases, requiring no division steps. For negative numbers, first convert the absolute value using the above methods, then prefix a minus sign to the hexadecimal result, as in signed magnitude representation.

To and From Binary

Converting binary numbers to hexadecimal involves grouping the binary digits into sets of four, known as nibbles, starting from the rightmost bit. Each nibble is then replaced by its corresponding hexadecimal digit, where 0000 represents 0, 0001 represents 1, up to 1111 representing F. If the total number of binary digits is not a multiple of four, leading zeros are added to the left to complete the leftmost nibble. For example, the binary number 11111111 groups into two nibbles (1111 and 1111), each equivalent to F, yielding FF in hexadecimal. The reverse process, converting hexadecimal to binary, replaces each hexadecimal digit with its four-bit binary equivalent: 0 is 0000, 1 is 0001, A is 1010, B is , C is 1100, D is 1101, E is 1110, and F is 1111. No padding is typically required, as each digit maps directly to a full . For instance, the hexadecimal number FF becomes 11111111 in binary by substituting F (1111) for each digit. This direct correspondence—one hexadecimal digit per —provides significant advantages in , particularly for representing bytes, which consist of eight bits or two nibbles; thus, a single byte requires exactly two hexadecimal digits for compact notation. Such conversions are supported natively in many tools, including scientific calculators in programmer mode and programming languages like Python, which offer built-in functions such as bin() for binary and hex() for hexadecimal representations, facilitating quick automation while manual methods remain useful for verification and understanding.

To Other Bases

Converting hexadecimal numbers to octal (base 8) is facilitated by their shared foundation as powers of two, allowing an intermediate binary representation where each hexadecimal digit corresponds to four bits and each octal digit to three bits. To perform the conversion, expand the hexadecimal number into its binary equivalent, then regroup the binary digits into sets of three starting from the right (padding with leading zeros if necessary), and replace each group with the corresponding octal digit. For example, the hexadecimal number FF expands to the binary 11111111; regrouping as 011 111 111 yields the octal 377, since 011 binary is 3, 111 is 7, and 111 is 7. Alternatively, conversion via decimal is possible but less direct for this pair. To convert numbers from other bases to hexadecimal, the general method involves first transforming the source number to using place-value expansion or repeated division, then applying the standard hexadecimal conversion from via repeated division by 16 and recording remainders. For bases that are powers of two, such as or base 4, a more efficient direct path exists through binary representation, avoiding full decimal intermediation. This approach leverages the compatible bit groupings: three bits per digit or two bits per base-4 digit aligning with the four bits per hexadecimal digit. Conversions between hexadecimal and less common bases, such as (base 12) or base 36, are rare in practice and invariably require chaining through as an intermediary, with no simplified direct mapping available due to incompatible radices. , historically used in some measurement systems like inches per foot, employs digits 0-9 and symbols for 10 (often A) and 11 (B), but lacks widespread computational adoption. Base 36, utilizing 0-9 and A-Z for values up to 35, appears occasionally in compact encodings like travel record locators or unique identifiers, yet such transformations from hexadecimal proceed via for accuracy. For instance, the hexadecimal FF (255 ) converts to 73 in base 36, as 7 × 36¹ + 3 × 36⁰ = 255. In all cases, no universal direct formula exists for hexadecimal conversions to arbitrary bases; efficiency depends on selecting an optimal intermediate like for general use or binary for power-of-two alignments, ensuring step-by-step verification to maintain precision.

Arithmetic

Basic Operations

Hexadecimal arithmetic follows the same principles as arithmetic but operates in base-16, where digits range from 0 to F (representing 0 to 15 in ), and carries or borrows occur when values exceed 15 or fall below 0, respectively. Operations are performed column-wise from right to left, with each position representing successive powers of 16.

Addition

Addition in hexadecimal is conducted digit by digit, starting from the least significant digit (rightmost), with a carry of 1 generated to the next column whenever the sum of digits plus any incoming carry equals or exceeds 16. The resulting digit is the sum 16, expressed using hexadecimal symbols (0-9, A-F). For example, adding FF (255 in ) and 1 proceeds as follows:

FF + 1 ---- 100

FF + 1 ---- 100

The units column sums to 15 + 1 = 16 (10 in hexadecimal, with carry 1); the sixteens column then sums to 15 + 0 + 1 (carry) = 16 (10 in hexadecimal, with carry 1), yielding 100 (256 in decimal). This process handles carries by wrapping digits at F, ensuring the base-16 structure is maintained.

Subtraction

Subtraction involves digit-by-digit deduction from right to left, borrowing 16 from the next higher column (equivalent to adding 16 to the current digit and subtracting 1 from the borrower) when the minuend digit is smaller than the subtrahend. The result is the difference, with borrows propagating as needed. For instance, subtracting 1 from 100 (256 in decimal) gives:

100 - 1 ---- FF

100 - 1 ---- FF

The units column requires borrowing: 0 - 1 becomes (16 - 1) = 15 (F), and the sixteens column adjusts from 0 - 0 - 1 (borrow) to 15 (F) after further borrowing from the 256s column (1 becomes 0). This results in FF (255 in ). Borrows ensure digits remain non-negative within 0-F.

in hexadecimal mirrors long , where each digit of the multiplicand is multiplied by each digit of the multiplier, shifted by appropriate powers of 16, and summed, with intermediate carries resolved modulo 16. Single-digit multiplications produce results up to F × F = E1 (15 × 15 = 225 in , or 14 × 16 + 1). For example, A (10 in ) × 2 = 14 (20 in ): Carries during partial product additions follow base-16 rules, similar to .

Division

Division uses adapted to base-16, dividing the into chunks that fit the , yielding a digit (0-F) and a less than 16, with the process repeating for subsequent digits. For example, 100 (256 in ) ÷ 10 (16 in ):

10 | 100 | 0 (initial partial dividend 10 < 10? No, but align) | 10 (10 goes into 10 once: 1 × 10 = 10, subtract 0) | 0 (bring down 0, 00 ÷ 10 = 0) ----- 10 rem 0

10 | 100 | 0 (initial partial dividend 10 < 10? No, but align) | 10 (10 goes into 10 once: 1 × 10 = 10, subtract 0) | 0 (bring down 0, 00 ÷ 10 = 0) ----- 10 rem 0

The quotient is 10 (16 in decimal), with remainder 0. Remainders are always expressed as a single hexadecimal digit.

Advanced Techniques

For efficient multiplication in hexadecimal arithmetic, multiplication tables provide a quick reference for products of single digits from 0 to F. These tables are constructed by computing each product in base 16, where results exceeding F require carrying over to higher digits, similar to the addition carry rules in basic operations. A partial table focusing on multiplications involving digits A through F illustrates the patterns, such as F × F = E1 (equivalent to 15 × 15 = 225 in decimal, or 14 × 16 + 1, yielding E1 in hex).
×ABCDEF
A646E78828C96
B6E79848F9AA5
C7884909CA8B4
D828F9CA9B6C3
E8C9AA8B6C4D2
F96A5B4C3D2E1
This table aids in manual calculations by reducing the need for repeated conversions. Powers of 16 in hexadecimal follow a simple pattern due to the base: 16n16^n is represented as 1 followed by n zeros. For instance, 160=116^0 = 1, 161=1016^1 = 10, 162=10016^2 = 100, 163=100016^3 = 1000, and so on, which directly corresponds to the positional weights in hex notation. This structure simplifies and powers in hex arithmetic, as no conversion is needed for pure powers of the base. Logarithms expressed directly in hexadecimal are rare, as they typically require approximation in or other bases for practical computation. Hexadecimal can represent rational numbers using a radix point, analogous to the point, where digits to the right denote negative powers of 16. For example, the 0x1F.F equals 1×161+15×160+15×161=16+15+0.9375=31.93751 \times 16^1 + 15 \times 16^0 + 15 \times 16^{-1} = 16 + 15 + 0.9375 = 31.9375 in , demonstrating how terminating in base 16 arise when the denominator's prime factors are limited to 2 and/or other factors of 16. Another example is 0x3F.4, which is 3×161+15×160+4×161=48+15+0.25=63.253 \times 16^1 + 15 \times 16^0 + 4 \times 16^{-1} = 48 + 15 + 0.25 = 63.25 . Non-terminating produce repeating expansions, limited by the base's factors. Irrational numbers like require infinite non-repeating expansions in hexadecimal, with approximations used for practical purposes. The hexadecimal representation of π begins as 3.243F6A8885A308D313198A2E037073..., where the part is 3 and the fractional digits start with 243F6A. This form is useful in contexts due to the BBP , which enables extraction of individual hex digits without prior computation. Such representations highlight the limits of finite digit approximations for irrationals in any base.

Applications

In Computing

In computing, hexadecimal notation is widely used to represent memory addresses due to its compact representation of binary data, where each hexadecimal digit corresponds to four bits (a nibble), allowing a full byte to be expressed with just two digits. For instance, RAM locations are commonly denoted with a "0x" prefix, such as 0x7FFF for a specific address in a 16-bit system. This format facilitates debugging by providing a human-readable view of machine-level data without the verbosity of binary strings. Hexadecimal is integral to and programming, where —instructions encoded as binary values—are typically displayed and manipulated in hex for clarity. In x86 assembly, for example, the instruction MOV AL, 0xFF (which moves the value 255 to the AL register) assembles to the hexadecimal bytes B0 FF, with B0 as the for moving an immediate 8-bit value to the AL register. This hexadecimal representation simplifies reading and writing low-level code, as it aligns closely with binary while being more concise. Data types in computing often leverage hexadecimal for efficient storage and visualization; a single byte, comprising 8 bits, is represented by exactly two hexadecimal digits, enabling straightforward inspection of binary files or buffers. Programming languages support hexadecimal literals prefixed by "0x" to denote integer constants in base-16, such as 0xDEADBEEF, a 32-bit value commonly used as a magic number for debugging or pattern recognition in memory. This convention is standardized in languages like C and C++, where it allows developers to specify values directly in a form that mirrors machine representation. Modern development tools extensively incorporate hexadecimal for low-level manipulation and analysis. Hex editors, such as or those integrated into IDEs, permit direct viewing and modification of file contents in hexadecimal format, essential for tasks like binaries or repairing corrupted data. Debuggers like GDB or display memory dumps and register values in hex, aiding in runtime inspection— for example, examining a buffer at address 0x00400000. In contemporary contexts, (Wasm) binaries are often inspected or authored using hexadecimal notation for opcodes and data segments, as seen in the Wasm binary format where instructions like i32.const -1 are encoded as 0x41 0xFF 0xFF 0xFF 0xFF. Similarly, Rust's and crates like hex provide robust parsing functions, such as hex::decode, to convert hexadecimal strings to byte arrays, supporting applications in and data .

In Data Encoding and Colors

Hexadecimal notation is widely used in for specifying colors through RGB values, where the format #RRGGBB represents red, green, and blue components as two hexadecimal digits each, allowing for 16,777,216 possible colors in the space. A form #RGB expands each digit to two identical values (e.g., #f09 becomes #ff0099), reducing the length while maintaining the same color range, as defined in CSS Color Module Level 3. This base-16 system facilitates theme creation, such as generating palettes by incrementing hex values for harmonious schemes like monochromatic or . In network protocols, MAC addresses employ hexadecimal to denote 48-bit identifiers, formatted as six pairs of two digits separated by colons or hyphens (e.g., AA:BB:CC:DD:EE:FF), ensuring unique device identification on local networks per IEEE standards. Similarly, Universally Unique Identifiers (UUIDs) use 128 bits expressed as 32 hexadecimal digits in an 8-4-4-4-12 grouped format with hyphens (e.g., 123e4567-e89b-12d3-a456-426614174000), as standardized in RFC 9562 for applications requiring collision-resistant IDs like and distributed systems. For data encoding, hexadecimal dumps provide a human-readable view of binary files, displaying bytes as two-digit hex values alongside ASCII interpretations to aid and , as implemented in utilities like hexdump. In data URIs, which embed resources directly in documents per RFC 2397, hexadecimal appears via (%HH for bytes), but is preferred for binary data due to its 33% size efficiency over hex's 100% overhead, though both ensure safe transmission in text contexts like or CSS. Post-2020 advancements in CSS, such as the color-mix() function introduced in CSS Color Module Level 5 (first public working draft in 2020), accept hexadecimal inputs for blending colors in specified spaces (e.g., color-mix(in , #ff0000 60%, #0000ff)), enabling dynamic themes with precise control over and alpha. In Unicode, are assigned code points in hexadecimal notation (e.g., U+1F600 for grinning face), facilitating their integration into text encoding standards and rendering across platforms.

History

Origins and Development

The concept of positional numeral systems, which form the foundation for bases like hexadecimal, originated in ancient civilizations. The Babylonians developed a base-60 (sexagesimal) system around 2000 BCE, inherited from earlier Sumerian and Akkadian traditions, using just two symbols—a vertical wedge for units and a chevron for tens—to represent values from 1 to 59 in each position, with place values as powers of 60. This allowed efficient handling of large numbers for astronomy, commerce, and geometry, though it lacked a zero symbol initially, relying on context to distinguish ambiguities like 1 from 60. Although base-10 dominated later Western mathematics, earlier explorations of higher bases included Gottfried Wilhelm Leibniz's work on base-16 notations, which he termed "sedecimal," in the late 17th century. Base-16 emerged more prominently as a proposal in the for enhanced computational efficiency. In 1845, English mathematician Thomas Wright Hill introduced a "sexdecimal" system, drawing from local weights like the 16-pound stone, and suggested combinable symbols for digits 10–15 to facilitate arithmetic without decimal's irregularities. This was followed in 1862 by Swedish-American inventor John William Nystrom's "tonal" base-16, which assigned phonetic names (e.g., "ton" for 10, "noll" for 0) and new symbols to streamline calculations, arguing it reduced errors in and division compared to base-10. The term "hexadecimal" first appeared in 1950, referring to the notation used for inputting numbers and instructions into the Standards Eastern Automatic Computer (SEAC), developed by the U.S. National Bureau of Standards. Hexadecimal's adoption in computing accelerated in the mid-20th century as machines shifted toward byte-oriented architectures. The IBM 704, introduced in 1954, relied on octal notation for programming and data representation, aligning with its 36-bit words and 6-bit BCD characters, as seen in early FORTRAN implementations where octal codes specified machine instructions. However, hexadecimal gained traction in the 1960s with the rise of 8-bit bytes; the PDP-8 minicomputer (1965) exemplified this era's transition, though it primarily used octal, while broader standardization occurred through systems like IBM's. By 1964, IBM's System/360 architecture explicitly employed hexadecimal in its technical manuals for instruction formats and memory dumps, defining digits A–F and establishing the modern notation that aligned perfectly with 4-bit nibbles. Standardization efforts further entrenched hexadecimal in the 1960s and 1970s. The American Standard Code for Information Interchange (ASCII), finalized in 1967 after development starting in 1960, routinely used hexadecimal to denote its 7-bit (later 8-bit) character codes in documentation and implementations, facilitating cross-system compatibility. In networking, the ARPANET (launched 1969) employed hexadecimal in 1970s protocol descriptions and packet analyses, as evidenced in early RFC documents where binary packet contents were dumped in hex for debugging and specification. Computer scientist Donald Knuth reinforced its utility in his 1969 work The Art of Computer Programming, Volume 2, praising hexadecimal as an efficient representation for binary data in algorithms and noting its etymological blend of Greek and Latin roots.

Cultural and Modern Usage

In programming communities, hexadecimal fosters humor via "," where sequences like (0xDEADBEEF) are used as to fill or signal errors, evoking jokes about "dead" programs or beefy computations. This pattern, popularized in hacker folklore since the , appears in debug outputs and , symbolizing the quirky intersection of binary reality and human wit. Hexadecimal is a staple in education worldwide, integrated into curricula to teach data representation and low-level concepts, such as converting binary to hex for addressing. In the UK, resources like Teach emphasize its role in understanding processor instructions, while in the , AP courses on use hex to illustrate compact encoding of colors and bytes. Online tools, including hex on sites like Calculator.net, support learning by enabling instant conversions and arithmetic, democratizing access for students and hobbyists. In blockchain technology, is fundamental for addresses, which are 42-character strings prefixed with "0x" to denote base-16 encoding of the last 20 bytes of a public key, ensuring unique identification on . This format facilitates secure transactions and smart contracts, with over 200 million addresses created by 2023. In the NFT space, hexadecimal strings serve as seeds for on platforms like Art Blocks, where pseudo-random hex hashes produce unique visuals, blending code with creativity in over 100,000 minted tokens since 2020. Globally, hexadecimal instruction in follows Western standards in most non-Western countries, such as and , where national curricula align with international CS frameworks like those from ACM, though emphasis varies—e.g., Japan's focus on embedded systems integrates hex earlier in secondary schooling. In regions like , adoption is growing via UNESCO-supported programs, but resource constraints lead to simplified tools over advanced simulations.

References

Add your contribution
Related Hubs
User Avatar
No comments yet.