十六進位

十六進位（Hexadecimal，簡寫為Hex或下標16）在數學中是一種逢16進1的進位制。一般用數字0到9和字母A到F表示，其中：A~F相當於十進位的10~15，這些稱作十六進位數字。

例如十進位數57，在二進位寫作111001，在16進位寫作39。

現在的16進位則普遍應用在電腦領域，這是因為將4個位元（Bit）化成單獨的16進位數字不太困難。1個位元組(Byte)可以表示成2個連續的16進位數字。可是，這種混合表示法容易令人混淆，因此需要一些字首、字尾或下標來顯示。

## 表示方式

不同電腦系統、編程語言對於16進位數值有不同的表示方式：

- Ada與VHDL用所基於的「數字引證」把16進位數包起來，例如「16#5A3#」。（註：Ada對整數和實數都可以使用從1到16中任何一個做為其基數。）而對於字節向量，VHDL使用字首 x 表示，例如，x"10"，對應的二進位碼為："00010000"。
- C語言、C++、Shell、Python、Java語言及其他相近的語言使用字首「0x」，例如「0x5A3」。開頭的「0」令解析器更易辨認數，而「x」則代表十六進位（就如「O」代表八進位）。在「0x」中的「x」可以大寫或小寫。對於字符量C語言中則以x+兩位十六進位數的方式表示，如xFF。
- C++11引進了十六進位浮點型字面常量。例如：`0x1.2p10`表示 （1+2/16）×210=115210。實際上，Visual C++一直以來使用的C/C++語言標準庫函數printf，`%a`作為類型說明符來格式化輸出浮點型值即為上述格式。例如：`printf("%a",1152.0);`
- C/C++在表示字符型字面常量時，可以用：
- 十六進位轉義序列：如 \x1abf4，可以使用任意多的十六進位數字，直至不是十六進位數字為止。
- 16位的通用字符名（universe-character name）：\u後面必須跟4個十六進位數字（不足四位前面用零補齊），表示Unicode中在0至0xFFFF之內的碼位（但不能表示0xD800到0xDFFF之內的碼點，Unicode標準規定這個範圍內的碼位保留，不表示字符）。
- 32位的通用字符名：\U後面必須跟8個十六進位數字（不足八位前面用零補齊），表示Unicode中所有可能的碼位（除0xD800到0xDFFF之外）。
- 在VB、MSX BASIC、Quick BASIC和FreeBASIC中，使用字首「&H」來表示。
- 在HTML，十六進位字元可以用「x」，例如&#x5a3;和֣效果應該無異。
- Intel的彙編語言中用字尾「h」來標識16進位的數（若該數以字母起首，在前面會增加一個「0」）例如「0A3Ch」、「5A3h」
- 其他組譯器（AT&T、Motorola、6502），Pascal，Delphi和某些BASIC的版本使用字首「$」，例如「$5A3」
- 亦有用`X'5A3'`這類表示方式的，如於PL/I，COBOL及JCL中。這亦是IBM裝載早期作業系統的大型機與小型機上最常用的數據格式。

由於表示方式沒有單一、已協定的標準，所以以上的表示方式都有被使用，有時甚至在同一份論文上會出現幾個不同的表示方式。但因為各方式之間沒有太大的分歧，所以即使混合使用也沒有構成問題。

其中最常用（或常見）表示十六進位數值的方式是將 '0x' 加在數字前，或在數字後加上小字 16。例如 0x2BAD 和 2BAD16 都是表示十進位的11181（或1118110）。

在網頁設計上十六進位是很常用的。HTML和CSS使用十六進位的表示法來表示網頁上的特定顏色。使用 # 的符號來表示而非用個別的符號表示十六進位。24-bit 顏色可以用 #RRGGBB 的格式來表示，RR 是顏色中紅色成分的數值，GG 是顏色中綠色成分的數值，BB 顏色中藍色成分的數值。舉個例子, 紅色的陰影是十進位238,9,63可以編成 #EE093F。參見網頁顏色.

在URL的特殊字元亦是用ASCII中的十六進位，每字節都有百份比符號（%）在前，例如：空格就表示為%20，而中文維基百科的首頁地址就是 https://zh.wikipedia.org/wiki/Wikipedia:%E9%A6%96%E9%A1%B5。在一些現代的瀏覽器，如Firefox中，地址中十六進位編碼會被解碼成實際字符，所以在這些瀏覽器中中文維基百科的首頁地址顯示成 https://zh.wikipedia.org/wiki/Wikipedia:首頁。

### 表示方法表

此中hex帶入具體16進位數。

環境｜格式｜備註

URL｜%hex

XML, XHTML｜&#xhex

HTML, CSS｜#hex｜6位,用於表示顏色

Unicode｜U+hex｜6位,表示字符編碼

MIME｜=hex

Modula-2｜#hex

Smalltalk, ALGOL 68｜16rhex

Common Lisp｜#xhex或#16rhex

IPv6｜8個hex用:分隔

## 十六進位的分數

與其他進位系統一樣，十六進位的系統可以用來表達分數，而循環小數也是很常見的：

1÷ 1｜ =｜1｜1÷ 5｜ =｜0.3｜1÷ 9｜ =｜0.1C7｜1÷ D｜ =｜0.13B

1÷ 2｜ =｜0.8｜1÷ 6｜ =｜0.2A｜1÷ A｜ =｜0.19｜1÷ E｜ =｜0.1249

1÷ 3｜ =｜0.5｜1÷ 7｜ =｜0.249｜1÷ B｜ =｜0.1745D｜1÷ F｜ =｜0.1

1÷ 4｜ =｜0.4｜1÷ 8｜ =｜0.2｜1÷ C｜ =｜0.15｜1÷ 10｜ =｜0.1

由於基數16是平方（42），所以與10進位相比16進位小數的餘數循環周期更加常見。十進位時當最簡分母包含不存在於基數的素因數時就會出現循環小數。而16進位時所有分母不是2的冪情況下都會表現為循環小數。

然而由於儲存上的方便，浮點小數在電腦上一般都會採用二進位。

## 十六進位的轉換

### 數學的計算方法

<image>

#### 十進位轉十六進位

採餘式定理分解，例如將487710轉成十六進位：

4877÷16=304...13(D)

304÷16=19...0

19÷16=1...3

1÷16=0...1

這樣就計到487710=130D16

### 編程中的函式

#### Visual Basic

- 十六進位轉換為十進位：十進位（Long型）=CLng("&H" & 十六進位數（String型）)
- 十進位轉換為十六進位：十六進位數（String型）=Hex$(十進位)

#### Javascript

Javascript 能以 toString 函數來將十進位數字轉為其他任意進位格式（String類型）

```javascript
var num = 255;
num.toString(16); // 將之轉為十六進制
```

亦可用 parseInt 函數將任意進位的字串轉為十進位數字

```javascript
var hexNum = "FF";
parseInt(hexNum, 16); // 將十六進制轉為10進制
```

#### Python

調用Python內置int函數把該字串轉為數字。以下為在Python解釋器編程環境下的操作示範：

```python
 print(int('ff', 16))  # 255
```

- 把十進位數字轉換為以十六進位表示之字串，可調用內置的hex函數：

```python
 print(hex(255))  # 0xff
```

- 調用BinAscii模塊其中的b2a_hex函數，可把以ASCII編碼的文字以十六進位表示：

```python
 print(binascii.b2a_hex('A'))  # 41
```

- 反之也可把以十六進位表示的文字，換成以ASCII編碼的文字：

```python
 print(binascii.a2b_hex('41'))  # A
```

#### Perl

十進位轉十六進位：

```perl
 #!/usr/local/bin/perl
 # filename: 10to16
 for ($i = 0; $i < @ARGV; $i++)
 {
 	printf("%d\t= 0x%x\n", $ARGV[$i], $ARGV[$i]);
 }
```

十六進位轉十進位：

```perl
 #!/usr/local/bin/perl
 # filename: 16to10
 for ($i = 0; $i < @ARGV; $i++)
 {
 	$val = hex($ARGV[$i]);
 	printf("0x%x\t= %d\n", $val, $val);
 }
```

用例（類UNIX系統中）：

先進入以上文件所在的文件夾，然後執行命令：

```
> ./10to16 100 512 789
100	= 0x64
512	= 0x200
789	= 0x315
> ./16to10 AB 5D9
0xAB	= 171
0x5D9	= 1497
```