基本概念
二進位是計算技術中廣泛採用的一種數製。二進位數據是用0和1兩個數碼來表示的數。它的基數為2,進位規則是“逢二進一”,借位規則是“借一當二”,由18世紀德國數理哲學大師萊布尼茲發現。當前的電腦系統使用的基本上是二進位系統。

資料在電腦中主要是以補碼的形式存儲的。電腦中的二進位則是一個非常微小的開關,用“開”來表示1,“關”來表示0。
20世紀被稱作第三次科技革命的重要標志之一的電腦的發明與套用,因為數位電腦隻能識別和處理由‘0’.‘1’符號串組成的代碼。其運算模式正是二進位。19世紀愛爾蘭邏輯學家喬治布爾對邏輯命題的思考過程轉化為對符號"0''.''1''的某種代數演算,二進位是逢2進位的進位製。0、1是基本算符。因為它隻使用0、1兩個數位符號,非常簡單方便,易于用電子方式實現。
簡介
20世紀被稱作第三次科技革命的重要標志之一的電腦的發明與套用,因為數位電腦隻能識別和處理由‘0’.‘1’符號串組成的代碼。其運算模式正是二進位。19世紀愛爾蘭邏輯學家喬治布爾對邏輯命題的思考過程轉化為對符號"0''.''1''的某種代數演算,二進位是逢2進位的進位製。0、1是基本算符。因為它隻使用0、1兩個數位符號,非常簡單方便,易于用電子方式實現。
主要特點
優點
數位裝置簡單可靠,所用元件少;
隻有兩個數碼0和1,因此它的每一位數都可用任何具有兩個不同穩定狀態的元件來表示;
基本運算規則簡單,運算操作方便。
缺點
用二進位表示一個數時,位數多。因此實際使用中多採用送入數位系統前用十進位,送入機器後再轉換成二進位數,讓數位系統進行運算,運算結束後再將二進位轉換為十進位供人們閱讀。
二進位和十六進位的互相轉換比較重要。不過這二者的轉換卻不用計算,每個C,C++程式員都能做到看見二進位數,直接就能轉換為十六進位數,反之亦然。
我們也一樣,隻要學完這一小節,就能做到。
首先我們來看一個二進位數:1111,它是多少呢?
你可能還要這樣計算:1 * 2^0 + 1 * 2^1 + 1 * 2^2 + 1 * 2^3 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。
然而,由于1111才4位,所以我們必須直接記住它每一位的權值,並且是從高位往低位記,:8、4、2、1。即,最高位的權值為2^3 = 8,然後依次是 2^2 = 4,2^1=2, 2^0 = 1。
記住8421,對于任意一個4位的二進位數,我們都可以很快算出它對應的10進位值。
下面列出四位二進位數 xxxx 所有可能的值(中間略過部分)
僅4位的2進位數快速計算方法 十進位值 十六進值
1111 = 8 + 4 + 2 + 1 = 15 F
1110 = 8 + 4 + 2 + 0 = 14 E
1101 = 8 + 4 + 0 + 1 = 13 D
1100 = 8 + 4 + 0 + 0 = 12 C
1011 = 8 + 0 + 2+ 1 = 11 B
1010 = 8 + 0 + 2 + 0 = 10 A
1001 = 8 + 0 + 0 + 1 = 9 9
....
0001 = 0 + 0 + 0 + 1 = 1
0000 = 0 + 0 + 0 + 0 = 0 0
二進位數要轉換為十六進位,就是以4位一段,分別轉換為十六進位。
如(上行為二製數,下面為對應的十六進位):
1111 1101 , 1010 0101 , 1001 1011
F D , A 5 , 9 B
反過來,當我們看到 FD時,如何迅速將它轉換為二進位數呢?
先轉換F:
看到F,我們需知道它是15(可能你還不熟悉A~F這六個數),然後15如何用8421湊呢?應該是8 + 4 + 2 + 1,所以四位全為1 :1111。
接著轉換 D:
看到D,知道它是13,13如何用8421湊呢?應該是:8 + 4+0+ 1,即:1101。
所以,FD轉換為二進位數,為: 1111 1101
由于十六進位轉換成二進位相當直接,所以,我們需要將一個十進位數轉換成2進位數時,也可以先轉換成16進位,然後再轉換成2進位。
比如,十進位數 1234轉換成二製數,如果要一直除以2,直接得到2進位數,需要計算較多次數。所以我們可以先除以16,得到16進位數:
1234 1234/16 77 2
77 77/16 4 13 (D)
4 4/16 0 4
結果16進位為: 0x4D2
然後我們可直接寫出0x4D2的二進位形式: 0100 1101 0010。
其中對映關系為:
0100 -- 4
1101 -- D
0010 -- 2
同樣,如果一個二進位數很長,我們需要將它轉換成10進位數時,除了前面學過的方法是,我們還可以先將這個二進位轉換成16進位,然後再轉換為10進位。
下面舉例一個int類型的二進位數:
01101101 11100101 10101111 00011011
我們按四位一組轉換為16進位: 6D E5 AF 1B
基本運算
二進位資料的算術運算的基本規律和十進位數的運算十分相似。最常用的是加法運算和乘法運算。
二進位加法
有四種情況: 0+0=0
0+1=1
1+0=1
1+1=10
ps:0 進位為1
【例1103】求 (1101)2+(1011)2 的和
解:
1 1 0 1
+1 0 1 1
-------------------
1 1 0 0 0
二進位乘法
有四種情況: 0×0=0
1×0=0
0×1=0
1×1=1
【例1104】求 (1110)2 乘(101)2 之積
解:
1 1 1 0
× 1 0 1
-----------------------
1 1 1 0
0 0 0 0
1 1 1 0
-------------------------
1 0 0 0 1 1 0
(這些計算就跟十進位的加或者乘法相同,隻是進位的數不一樣而已,十進位的是到十才進位這裏是到2就進了)
3.二進位減法
0-0=0,1-0=1,1-1=0,10-1=1。
4.二進位除法
0÷1=0,1÷1=1。[1-2]
5.二進位拈加法
拈加法二進位加減乘除外的一種特殊演算法。
拈加法運算與進行加法類似,但不需要做進位。此演算法在博弈論(Game Theory)中被廣泛利用
電腦中的十進位小數轉換二進位
電腦中的十進位小數用二進位通常是用乘二取整法來獲得的。
比如0.65換算成二進位就是:
0.65 * 2 = 1.3 取1,留下0.3繼續乘二取整
0.3 * 2 = 0.6 取0, 留下0.6繼續乘二取整
0.6 * 2 = 1.2 取1,留下0.2繼續乘二取整
0.2 * 2 = 0.4 取0, 留下0.4繼續乘二取整
0.4 * 2 = 0.8 取0, 留下0.8繼續乘二取整
0.8 * 2 = 1.6 取1, 留下0.6繼續乘二取整
0.6 * 2 = 1.2 取1,留下0.2繼續乘二取整
.......
一直迴圈,直到達到精度限製才停止(所以,電腦儲存的小數一般會有誤差,所以在編程中,要想比較兩個小數是否相等,隻能比較某個精度範圍內是否相等。)。這時,十進位的0.65,用二進位就可以表示為:1010011。
還值得一提的是,在目前的電腦中,除了十進位是有符號的外,其他如二進位、八進位、16進位都是無符號的。
進位轉換
十進位數轉換為二進位數、八進位數、十六進位數的方法:
二進位數、八進位數、十六進位數轉換為十進位數的方法:按權展開求和法
二進位與十進位間的相互轉換
(1)二進位轉十進位
方法:“按權展開求和”
例: (1011.01)2 =(1×2^3+0×2^2+1×2^1+1×2^0+0×2^(-1)+1×2^(-2) )10
=(8+0+2+1+0+0.25)10
=(11.25)10
規律:個位上的數位的次數是0,十位上的數位的次數是1,......,依次遞增,而十
分位的數位的次數是-1,百分位上數位的次數是-2,......,依次遞減。
註意:不是任何一個十進位小數都能轉換成有限位的二進位數。
(2)十進位轉二進位
· 十進位整數轉二進位數:“除以2取餘,逆序排列”(除二取餘法)
例: (89)10 =(1011001)2
89÷2 ……1
44÷2 ……0
22÷2 ……0
11÷2 ……1
5÷2 ……1
2÷2 ……0
1
· 十進位小數轉二進位數:“乘以2取整,順序排列”(乘2取整法)
例: (0.625)10= (0.101)2
0.625X2=1.25 ……1
0.25 X2=0.50 ……0
0.50 X2=1.00 ……1
十進位1至100的二進位表示
0=0
1=1
2=10
3=11
4=100
5=101
6=110
7=111
8=1000
9=1001
10=1010
11=1011
12=1100
13=1101
14=1110
15=1111
16=10000
17=10001
18=10010
19=10011
20=10100
21=10101
22=10110
23=10111
24=11000
25=11001
26=11010
27=11011
28=11100
29=11101
30=11110
31=11111
32=100000
33=100001
34=100010
35=100011
36=100100
37=100101
38=100110
39=100111
40=101000
41=101001
42=101010
43=101011
44=101100
45=101101
46=101110
47=101111
48=110000
49=110001
50=110010
51=110011
52=110100
53=110101
54=110110
55=110111
56=111000
57=111001
58=111010
59=111011
60=111100
61=111101
62=111110
63=111111
64=1000000
65=1000001
66=1000010
67=1000011
68=1000100
69=1000101
70=1000110
71=1000111
72=1001000
73=1001001
74=1001010
75=1001011
76=1001100
77=1001101
78=1001110
79=1001111
80=1010000
81=1010001
82=1010010
83=1010011
84=1010100
85=1010101
86=1010110
87=1010111
88=1011000
89=1011001
90=1011010
91=1011011
92=1011100
93=1011101
94=1011110
95=1011111
96=1100000
97=1100001
98=1100010
99=1100011
100=1100100
八進位與二進位的轉換
二進位數轉換成八進位數:從小數點開始,整數部分向左、小數部分向右,每3位為一組用一位八進位數的數位表示,不足3位的要用“0”補足3位,就得到一個八進位數。
八進位數轉換成二進位數:把每一個八進位數轉換成3位的二進位數,就得到一個二進位數。
八進位數位與二進位數位對應關系如下:
000 -> 0 100 -> 4
001 -> 1 101 -> 5
010 -> 2 110 -> 6
011 -> 3 111 -> 7
例:將八進位的37.416轉換成二進位數:
3 7 . 4 1 6
011 111 .100 001 110
即:(37.416)8 =(11111.10000111)2
例:將二進位的10110.0011 轉換成八進位:
0 1 0 1 1 0 . 0 0 1 1 0 0
2 6 . 1 4
即:(10110.011)2 = (26.14)8
十六進位與二進位的轉換
二進位數轉換成十六進位數:從小數點開始,整數部分向左、小數部分向右,每4位為一組用一位十六進位數的數位表示,不足4位的要用“0”補足4位,就得到一個十六進位數。
十六進位數轉換成二進位數:把每一個十六進位數轉換成4位的二進位數,就得到一個二進位數。
十六進位數位與二進位數位的對應關系如下:
0000 -> 0 0100 -> 4 1000 -> 8 1100 -> C
0001 -> 1 0101 -> 5 1001 -> 9 1101 -> D
0010 -> 2 0110 -> 6 1010 -> A 1110 -> E
0011 -> 3 0111 -> 7 1011 -> B 1111 -> F
例:將十六進位數5DF.9 轉換成二進位:
5 D F . 9
0101 1101 1111 .1001
即:(5DF.9)16 =(10111011111.1001)2
例:將二進位數1100001.111 轉換成十六進位:
0110 0001 . 1110
6 1 . E
即:(1100001.111)2 =(61.E)16
其他資料
20世紀被稱作第三次科技革命的重要標志之一的電腦的發明與套用,其運算模式正是二進位,同時證明了萊布尼茲的原理是正確的。
二進位資料的表示法
二進位資料也是採用位置計數法,其位權是以2為底的冪。例如二進位資料110.11,其權的大小順序為2^2、2^1、2^0、2^-1、2^-2。對于有n位整數,m位小數的二進位資料用加權系數展開式表示,可寫為:
(a(n-1)a(n-2)…a(-m))2=a(n-1)×2^(n-1)+a(n-2)×2^(n-2)+……+a(1)×2^1+a(0)×2^(0)+a(-1)×2^(-1)+a(-2)×2^(-2)+……+a(-m)×2^(-m)
二進位資料一般可寫為:(a(n-1)a(n-2)…a(1)a(0).a(-1)a(-2)…a(-m))2。
註意:
1.式中aj表示第j位的系數,它為0和1中的某一個數。
2.a(n-1)中的(n-1)為下標,輸入法無法打出所以用括弧括住,避免混淆。
3.2^2表示2的平方,以此類推。
【例1102】將二進位資料111.01寫成加權系數的形式。
解:(111.01)2=(1×2^2)+(1×2^1)+(1×2^0)+(0×2^-1)+(1×2^-2)
二進位和十六進位,八進位一樣,都以二的冪來進位的。
萊布尼茨與二進位
在德國圖靈根著名的郭塔王宮圖書館(Schlossbiliothke zu Gotha)儲存著一份彌足珍貴的手稿,其標題為:“1與0,一切數位的神奇淵源。這是造物的秘密美妙的典範,因為,一切無非都來自上帝。”這是德國天才大師萊布尼茨(Gottfried Wilhelm Leibniz,1646 - 1716)的手跡。但是,關于這個神奇美妙的數位系統,萊布尼茨隻有幾頁異常精煉的描述。

萊布尼茨不僅發明了二進位,而且賦予了它宗教的內涵。他在寫給當時在中國傳教的法國耶穌士會牧師布維(Joachim Bouvet,1662 - 1732)的信中說:“第一天的伊始是1,也就是上帝。第二天的伊始是2,……到了第七天,一切都有了。所以,這最後的一天也是最完美的。因為,此時世間的一切都已經被創造出來了。因此它被寫作‘7’,也就是‘111’(二進位中的111等于十進位的7),而且不包含0。隻有當我們僅僅用0和1來表達這個數位時,才能理解,為什麽第七天才最完美,為什麽7是神聖的數位。特別值得註意的是它(第七天)的特征(寫作二進位的111)與三位一體的關聯。”
布維是一位漢學大師,他對中國的介紹是17、18世紀歐洲學界中國熱最重要的原因之一。布維是萊布尼茨的好朋友,一直與他保持著頻繁的書信往來。萊布尼茨曾將很多布維的文章翻譯成德文,發表刊行。恰恰是布維向萊布尼茨介紹了《周易》和八卦的系統,並說明了《周易》在中國文化中的權威地位。
八卦是由八個符號組構成的佔卜系統,而這些符號分為連續的與間斷的橫線兩種。這兩個後來被稱為“陰”、“陽”的符號,在萊布尼茨眼中,就是他的二進位的中國翻版。他感到這個來自古老中國文化的符號系統與他的二進位之間的關系實在太明顯了,因此斷言:二進位乃是具有世界普遍性的、最完美的邏輯語言。
另一個可能引起萊布尼茨對八卦的興趣的人是坦澤爾(Wilhelm Ernst Tentzel),他當時是圖靈根大公爵硬幣珍藏室的領導,也是萊布尼茨的好友之一。在他主管的這個硬幣珍藏中有一枚印有八卦符號的硬幣。
與中國易經的聯系
1679年3月15日戈特弗裏德·威廉·萊布尼茨發明了一種計演算法,用兩位數代替原來的十位數,即1 和 0。 1701年他寫信給在北京的神父 Grimaldi(中文名字閔明我)和 Bouvet(中文名字白晉)告知自己的新發明,希望能引起他心目中的“算術愛好者”康熙皇帝的興趣。
白晉很驚訝,因為他發現這種“二進位的算術”與中國古代的一種建立在兩個符號基礎上的符號系統是非常近似的,這兩個符號分別由一條直線和兩條短線組成,即── 和 — —。這是中國最著名大概也是最古老的書《易經》的基本組成部分,據今人推測,該書大約產生于公元前第一個千年的初期,開始主要是一部佔卜用書,裏邊的兩個符號可能分別代表“是”和“不”。
萊布尼茨對這個相似也很吃驚,和他的筆友白晉一樣,他也深信《易經》在數學上的意義。他相信古代的中國人已經掌握了二進位並在科學方面遠遠超過當代的中國人。現在我們可以肯定地說,這種解釋與《易經》沒有聯系。《易經》不是數學書,而是一本“預言”,並在漫長的歷史中逐漸演變為一本“智慧之書”。書裏的短線意味著陰陽相對,也即天與地、光明與黑暗、造物主和大自然。六爻以不同的組合出現,人們可以借此對自然界和人類生活的變換做出各種不同的解釋。比利時神父 P.Couplet(中文名字柏應理)的 Confucius.Sinarum Philosophus (《孔子,中國人的思想家,…》)第一次在歐洲發表了易經的六十四幅六爻八卦圖。

這一次將數學與古代中國《易經》相聯的嘗試是不符合實際的。萊布尼茨的二進位數學指向的不是古代中國,而是未來。萊布尼茨在1679年3月15日記錄下他的二進位體系的同時,還設計了一台可以完成數碼計算的機器。我們今天的現代科技將此構想變為現實,這在萊布尼茨的時代是超乎人的想象能力的。
電腦內部採用二進位的原因
(1)技術實現簡單,電腦是由邏輯電路組成,邏輯電路通常隻有兩個狀態,開關的接通與斷開,這兩種狀態正好可以用“1”和“0”表示。
(2)簡化運算規則:兩個二進位數和、積運算組合各有三種,運算規則簡單,有利于簡化電腦內部結構,提高運算速度。
(3)適合邏輯運算:邏輯代數是邏輯運算的理論依據,二進位隻有兩個數碼,正好與邏輯代數中的“真”和“假”相吻合。
(4)易于進行轉換,二進位與十進位數易于互相轉換。
(5)用二進位表示資料具有抗幹擾能力強,可靠性高等優點。因為每位資料隻有高低兩個狀態,當受到一定程度的幹擾時,仍能可靠地分辨出它是高還是低。
二進位與周易的澄清
改革開放前,大多數中國人不知道電腦是什麽東西。1980年,美國人第一台8086CPU晶片個人電腦(PC,俗稱電腦)上市,80年代初,中國出現了進口電腦。一台蘋果機,價格近兩萬元,是普通幹部工人工資的數百倍,個人根本沒有能力購買。90年代以後中國有了網際網路,電腦才逐步為中國人所熟悉。
面對外來的先進科學技術,中國有些傳統文化人很不服氣,連基本數學常識都沒有,卻說什麽電腦二進位原理,源于中國的《周易》。這些文化人有個共同特點,大力宣揚用傳統文化抵製西方文化的同時,卻喜歡拉個外國名人為自己壯膽。可是忽略了一點,老祖宗的東西既然如此偉大,為什麽中國人發明不了,愣是讓西方人萊布尼茲搶了頭功?
飛機與鳥兒都能在高空中飛翔,飛機的原理卻不是來自鳥類。同樣,萊布尼茲見過中國的太極圖,不能證明電腦二進位原理源于《易經》。
據說伏羲創八卦。傳說中的伏羲時代已有5000多年歷史了。5000多年前的人類已經有了計數能力,可是還沒有“0”這個數位概念,直到公元628年,印度人Brahmagupta首次使用O。12世紀印度人Bhaskara指出正數的平方根有兩個,一正一負。(《數學:確定性的喪失 英.M.克來因》湖南科技出版社)。
0不僅僅表示“無”或“沒有”,如氣溫0度,不是沒有溫度。有了0,就可建立一個參照系,如在一條直線上任取一點為0,0點的左邊為負數,右邊為正數。
學過電腦原理的人都知道,電腦電路的高電平和低電平對應二進位數1與0。若高電平為1,則低電平為0;反之,高電平為0,低電平為1。這是正邏輯與反邏輯問題。電腦的工作原理基于“布爾代數”,進行邏輯運算。電腦電路盡管十分復雜,但基本單元卻很簡單,由或門、與門、非門、與非門、或非門、異或門、同或門等組成。
因為電腦是高科技,有人就想當然,二進位也是高科技。如百家講壇的毛佩奇教授在他的《圖解周易》書中說,二進位是“世界上數學進位中最先進的”,“20世紀被稱作第三次科技革命的重要標志之一的電腦的發明與套用,其運算模式是二進位。它不但證明了萊布尼茨的原理是正確的,同時也證明了《易經》數理原理是很了不起的。”
毛教授代表了相當一部分中國傳統文化人的觀點。這是對數學進位的無知,數學的進位原理,不存在“正確”與“錯誤”,更沒有“先進”與“落後”之分。
用什麽製式進行數學運算,要看什麽場合,什麽方便用什麽。數學上有二進位、八進位、十進位、十六進位、六十進位,…等多種進位,原則上可取任何數進位,隻要它實用。12個月一年是十二進位,365天一年是三百六十五進位。不同進位的數可以相互轉換,如十進位135,轉換成二進位為10000111,二進位的101轉換成十進位為5。很顯然,若人工進行十進位計算135除5,十分簡捷,但換成二進位100001111除101,計算起來既費力又費時間,是最笨拙的進位。
易經八卦陽爻為一長劃“一”,陰爻為一斷劃“--”(馬王堆西漢考古證明,陰爻為“<”。後來演變成“--”),陰陽二爻任取三爻成一卦,共八個卦,八卦兩兩疊加,成六十四卦。這是十進位數的乘方運算,23=8,82=64,與二進位毫不相關。
有人認為,把八卦的陽爻“一”視作1,陰爻“--”視作0,就是二進位。這是牽強附會,因為八卦產生的年代還沒有0與1的概念。
乾坤二卦象征天地。乾卦由三個陽爻“一”上下疊加組成,坤卦由三個陰爻“--”上下疊加組成。若把陽爻符號“一”看成1,陰爻符號“--”視作0,則乾卦三個爻為二進位111,對應十進位7;坤卦三個爻為二進位000,對應十進位0。
《系辭》曰:“易有太極,是生兩儀,兩儀生四象,四象生八卦”,太極即無,無中生有,產生8個卦。若0等于無,太極即0,這豈不與上面說的坤為0相矛盾?並且,乾一、兌二、離三、震四、巽五、坎六、艮七、坤八,八個卦的“數”,都不能與各自六個爻符轉換成的“二進位數”一一對應。
兩個八卦疊加成六十四卦,六十四卦各由六個爻組成。如乾卦為六個“一”,對應二進位111111,轉換成十進位,25+24+23+22+21+20=63;坤卦六個陰爻“--”,對應二進位000000,轉換成十進位仍為0。六十四個卦的“數”,與各自的六個爻符轉換成的“二進位數”,也不能一一對應。
古代漢字有“零”,零並不等于0,零的含意是:1,部分的、細碎的,與整相對,如零碎、十元零八毛;2,落,如雕零。零的現代意義,可以是無,如“一切從零開始”。
沒有0這個數,二進位無從談起(有沒有0不重要,0和1隻是代表了開和關二字。)。
《易經》有數理原理,八八六十四卦有簡單的算術運算,但二進位源于八卦之說,是以訛傳訛。遠古時代先民畫的八卦佔卜符號,競成了高科技電腦的數學原理,無疑是現代版的天方夜譚。
處理資料庫二進位資料
我們在使用資料庫時,有時會用到圖像或其它一些二進位資料,這個時候你們就必須使用getchunk這個方法來從表中獲得二進位大對象,我們也可以使用AppendChunk來把資料插入到表中.

我們平時來取資料是這樣用的!
Getdata=rs("fieldname")
而取二進位就得這樣
size=rs("fieldname").acturalsize
getdata=rs("fieldname").getchunk(size)
我們從上面看到,我們取二進位資料必須先得到它的大小,然後再搞定它,這個好像是ASP中處理二進位資料的常用方法,我們在獲取從客戶端傳來的所有資料時,也是用的這種方法。
下面我們也來看看是怎樣將二進位資料加入資料庫
rs("fieldname").appendchunk binarydata
一步搞定!
另外,使用getchunk和appendchunk將資料一步一步的取出來!
下面演示一個取資料的例子!
Addsize=2
totalsize=rs("fieldname").acturalsize
offsize=0
Do Where offsize Binarydata=rs("fieldname").getchunk(offsize)
data=data&Binarydata
offsize=offsize+addsize
Loop
當這個程式運行完畢時,data就是我們取出的資料.