十六進位

以16為基底之進位制

十六進位英語: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進位數字。可是,這種混合表示法容易令人混淆,因此需要一些字首、字尾或下標來顯示。

0hex = 0dec = 0oct 0 0 0 0
1hex = 1dec = 1oct 0 0 0 1
2hex = 2dec = 2oct 0 0 1 0
3hex = 3dec = 3oct 0 0 1 1
4hex = 4dec = 4oct 0 1 0 0
5hex = 5dec = 5oct 0 1 0 1
6hex = 6dec = 6oct 0 1 1 0
7hex = 7dec = 7oct 0 1 1 1
8hex = 8dec = 10oct 1 0 0 0
9hex = 9dec = 11oct 1 0 0 1
Ahex = 10dec = 12oct 1 0 1 0
Bhex = 11dec = 13oct 1 0 1 1
Chex = 12dec = 14oct 1 1 0 0
Dhex = 13dec = 15oct 1 1 0 1
Ehex = 14dec = 16oct 1 1 1 0
Fhex = 15dec = 17oct 1 1 1 1

表示方式 編輯

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

  • AdaVHDL用所基於的「數位引證」把16進位數包起來,例如「16#5A3#」。(註:Ada對整數和實數都可以使用從1到16中任何一個做為其基數。)而對於位元組向量,VHDL使用字首 x 表示,例如,x"10",對應的二進位碼為:"00010000"。
  • C語言、C++、ShellPythonJava語言及其他相近的語言使用字首「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」,例如֣和֣效果應該無異。
  • Intel的組合語言中用字尾「h」來標識16進位的數(若該數以字母起首,在前面會增加一個「0」)例如「0A3Ch」、「5A3h」
  • 其他組譯器(AT&TMotorola、6502),PascalDelphi和某些BASIC的版本使用字首「$」,例如「$5A3」
  • 亦有用X'5A3'這類表示方式的,如於PL/ICOBOLJCL中。這亦是IBM裝載早期作業系統的大型電腦小型機上最常用的資料格式。
記數系統
印度-阿拉伯數位系統
西方阿拉伯數位
阿拉伯文數位
高棉數字
孟加拉數位
印度數字
波羅米數字
泰語數位
漢字文化圈記數系統
中文數位
閩南語數字
越南語數位
算籌
日語數字
韓語數字
蘇州碼子
字母記數系統
阿拉伯字母數字
亞美尼亞數位
西里爾數字
吉茲數字
希伯來數字
希臘數位
阿利耶波多數字
其它記數系統
阿提卡數字
巴比倫數字
古埃及數位
伊特拉斯坎數字
瑪雅數位
羅馬數位
熙篤會數位
卡克托維克數位
底數區分的進位制系統
1 2 3 4 5 6 8 9 10 11 12
16 20 36 60

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

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

網頁設計上十六進位是很常用的。HTMLCSS使用十六進位的表示法來表示網頁上的特定顏色。使用 # 的符號來表示而非用個別的符號表示十六進位。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的冪情況下都會表現為迴圈小數。

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

十六進位的轉換 編輯

數學的計算方法 編輯

 
十六進位的乘法表

十進位轉十六進位 編輯

餘式定理分解,例如將487710轉成十六進位:

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

304÷16=19...0

19÷16=1...3

這樣就計到487710=130D16


編程中的函式 編輯

Visual Basic 編輯

  • 十六進位轉換為十進位:十進位(Long型)=CLng("&H" & 十六進位數(String型))
  • 十進位轉換為十六進位:十六進位數(String型)=Hex$(十進位)

Javascript 編輯

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

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

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

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

Python 編輯

調用Python內建int()函式把該字串轉為數字。以下為在Python直譯器編程環境下的操作示範:

  • 把十六進位的字串轉為十進位數字:
 print(int('ff', 16))
255
  • 把十進位數字轉換為以十六進位表示之字串,可調用內建的hex()函式:
 print(hex(255))
0xff
  • 調用BinAscii模組其中的b2a_hex()函式,可把以ASCII編碼的文字以十六進位表示:
 print(binascii.b2a_hex('A'))
41
反之也可把以十六進位表示的文字,換成以ASCII編碼的文字:
 print(binascii.a2b_hex('41'))
A

Perl 編輯

十進位轉十六進位:

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

十六進位轉十進位:

 #!/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

外部連結 編輯