一.計算機中為什么要用二進制
1.計算機中一個數是用電子器件的“開”和“關”來表示的,即二進制的“1”和“0”。
2.二進制運算法則簡單。如加法:0+0=0,0+1=1+0=1,1+1=10 (3個公式)而十進制加法法則需記55個公式。
3.二進制是計算機中采用的基本數制;而八進制和十六進制用作二進制的壓縮形式;十進制是理解其他數制的基礎。
如:串行通訊接口COM1口的輸入輸出端口地址用 03F8-03FF(十六進制數)表示 。
二.四種進位計數制的基數、位權和權值
進位計數制是一種數的表示方法,它按進位的方式來計數,簡稱為進位制。
1. 十進制的基數是10,10個數字符號,0、1、2、3、4、5、6、7、8、9
進位規則:逢10進1
例:(518)10 =5*102+1*101+8*100
102 101 100 是十進制的位權
100 10 0 權值
2.二進制的基數是2, 2個數字符號, 0、1
進位規則:逢2進1
例:(1101)2 =1*23+1*22+0*21+1*20 =(13)10
23 22 21 20 是二進制的位權
8 4 2 1 權值
3.十六進制基數是16,16個數字符號, 0、1、2、3、4、5、6、
7、8、9、A、B、C、D、E、F
進位規則:逢16進1
例:(2AF)16 =2*162+A*161+F*160 =(687)10
162 161 160 是十六進制的位權
256 16 1 權值
4、八進制基數是8,8個數字符號,0、1、2、3、4、5、6、7
進位規格:逢8進1
例:(112)8 =1*82+1*81+2*80 =(74)10
82 81 80 是八進制的位權
64 8 2 權值
四種進制的縮寫:
十進制:518D、 二進制:1101B、十六進制:2AFH 八進制:以0開頭
二進制 |
十進制 |
十六進制 |
八進制 |
二進制 |
十進制 |
十六進制 |
八進制 |
0 |
0 |
0 |
0 |
1001 |
9 |
9 |
11 |
1 |
1 |
1 |
1 |
1010 |
10 |
A |
12 |
10 |
2 |
2 |
2 |
1011 |
11 |
B |
13 |
11 |
3 |
3 |
3 |
1100 |
12 |
C |
14 |
100 |
4 |
4 |
4 |
1101 |
13 |
D |
15 |
101 |
5 |
5 |
5 |
1110 |
14 |
E |
16 |
110 |
6 |
6 |
6 |
1111 |
15 |
F |
17 |
111 |
7 |
7 |
7 |
10000 |
16 |
10 |
20 |
1000 |
8 |
8 |
10 |
1001 |
/ |
/ |
/ |
三.二進制數的算術運算
1. 二進制數的算術運算
(1). 二進制數的加法
法則:0+0 =0
0+1 = 1+0 = 1
1+1 = 10 (進位)
例:(1011)2 +(1110)2 = (11001)2
1011
+ 1110
11001
(2).二進制數的減法
法則: 0—0 = 0
1—0 = 1
0—1 = 1(有借位)
1—1 = 0
例:(1101)2 —(0110)2 =(0111)2
(3).二進制數的乘法
法則:0*0=0
0*1=1*0=0
1*1=1
例:(1100)2*(1010)2 =(1111000)2
(4).二進制數的除法
法則:0 / 0 = 0
1 / 1 = 1
例:(1111000)2 /(1010)2 = (1100)2
2. 二進制數的邏輯運算
邏輯變量之間的運算稱為邏輯運算。可以表示為“真”與“假”、“是”與“否”、“有”與“無”。
(1)“或”運算(邏輯加法),符號“V”或“+”
0 V 0 = 0
0 V 1 = 1 V 0 = 1
1 V 1 = 1
兩個變量只要有一個為1,其邏輯加的結果就為1;兩者都為1,則邏輯加當然為1。
或邏輯關系相當於“電燈”的並聯關系。
(2)“與”運算(邏輯乘法),符號“∧”或“Х”“· ”
0 ∧ 0 = 0
0 ∧ 1 = 1 ∧ 0 = 0
1 ∧ 1 = 1
只有參與運算的邏輯變量都同時為1時,邏輯乘積才等於1。
與邏輯關系相當於“用電器”的串聯關系。
(3)“非”運算(邏輯否定)
非0等於1
非1等於0
(4)異或邏輯關系 符號“⊕”
0⊕0 = 0
0⊕1 = 1
1⊕0 = 1
1⊕1 = 0
只要兩個邏輯變量相同,則“異或”運算的結果就位 0 ;當兩個邏輯變量不同時,則“異或”的結果才為1。
因此,以上邏輯運算沒有算術運算中的進位或借位問題。
邏輯運算在計算機內部的電路設計、軟件以及數據處理過程中經常使用。
四. 不同進制之間的數據轉換
1. 十進制數與二進制數之間的轉換
(1). 2 1 0
將二進制數轉換成十進制數:按位權展開求和。
整數:(11001100)2 =(204)10
小數:(1000001.01)2 =(65.25) 10
(2). 10 2
整數:“除二取余”“下高上底”
例:(238)10=(11101110)2
簡便算法:將十進制數分解成若干個2的整次冪之和,
例:(238)10 =128+64+32+8+4+2=27+26+25+23+22+21
=(11101110)2
小數“乘二取整” “上高下底”
例:(0.75)10 =(0.11)2
3. 二進制數與十六進制數之間的轉換
因為24 = 161,28 = 162,即4位二進制數可表示一位十六進制數。
(1) 2 16
每4位分1組,不足4位前補0
例:(10111010011010)2 =(2E9A)16
(2) 16 2
例:(2E9A)16 =(10111010011010)2
3.十進制數與十六進制數之間的轉換
(1) 10 16
“除十六取余” “下高上底”
或:10 2 16
(228)10=(11100100)2 =(E4)16
(2)16 10 按權展開
(568)16 =5*162+6*161+8*160 =5*256+6*16+8*1 =(1384)10
或:16 2 10
4、八進制化為十進制:
例:將八進制數12轉換成十進制數
(12)8 =1*81+2*80 =(10)10
5、八進制化為二進制:
規則:按照順序,每1位八進制數改寫成等值的3位二進制數,次序不變。
例: (17.36)8 = (001 111 .011 110)2 = (1111.01111)2
6、八進制化為十六進制
先將八進制化為二進制,再將二進制化為十六進制。
例:(712)8 = (1110 0101 0)2 = (1CA)16
轉換為八進制
7、二進制化為八進制:
整數部份從最低有效位開始,以3位一組,最高有效位不足3位時以0補齊,每一組均可轉換成一個八進制的值,轉換完畢就是八進制的整數。
小數部份從最高有效位開始,以3位一組,最低有效位不足3位時以0補齊,每一組均可轉換成一個八進制的值,轉換完畢就是八進制的小數。
例:(11001111.01111)2 = (011 001 111.011 110)2 = (317.36)8
8、十六進制化為八進制:
先用1化4方法,將十六進制化為二進制;再用3並1方法,將二進制化為8進制。
例: (1CA)16 = (111001010)2 = (712)8
說明:小數點前的高位零和小數點后的低位零可以去除。
9、十進制化八進制
方法1:采用除8取余法。
例:將十進制數115轉化為八進制數
8| 115…… 3
8| 14 …… 6
8| 1 …… 1
結果:(115)10 = (163)8
方法2:先采用十進制化二進制的方法,再將二進制數化為八進制數
例:(115)10 = (1110011)2 = (163)8
五、二進制的位運算(java)
位運算是java中很重要的基礎知識,涉及到數據的讀寫、IO流、數據處理等多方面的知識,熟練掌握位運算對於我們學習IO相關知識有很大的好處。
含義 |
C語言 |
Java |
|
按位與 |
a and b |
a & b |
a & b |
a or b |
a | b |
a | b |
|
按位異或 |
a xor b |
a ^ b |
a ^ b |
按位取反 |
not a |
~a |
~a |
左移 |
a shl b |
a << b |
a << b |
帶符號右移 |
a shr b |
a >> b |
a >> b |
無符號右移 |
|
|
a>>> b |
(1)、運算說明
=== 1. and運算 & ===
and運算通常用於二進制的取位操作,例如一個數 and 1的結果就是取二進制的最末位。這可以用來判斷一個整數的奇偶,二進制的最末位為0表示該數為偶數,最末位為1表示該數為奇數。
相同位的兩個數字都為1,則為1;若有一個不為1,則為0。
00101
11100
(&;或者and)
----------------
00100
=== 2. or運算 | ===
or運算通常用於二進制特定位上的無條件賦值,例如一個數or 1的結果就是把二進制最末位強行變成1。如果需要把二進制最末位變成0,對這個數or 1之后再減一就可以了,其實際意義就是把這個數強行變成最接近的偶數。
相同位只要一個為1即為1。
00101
11100
(|或者or)
----------------
11101
=== 3. xor運算 ^ ===
異或的符號是^。按位異或運算, 對等長二進制模式按位或二進制數的每一位執行邏輯按位異或操作. 操作的結果是如果某位不同則該位為1, 否則該位為0.
xor運算的逆運算是它本身,也就是說兩次異或同一個數最后結果不變,即(a xor b) xor b = a。xor運算可以用於簡單的加密,比如我想對我MM說1314520,但怕別人知道,於是雙方約定拿我的生日19880516作為密鑰。1314520 xor 19880516 = 20665500,我就把20665500告訴MM。MM再次計算20665500 xor 19880516的值,得到1314520,於是她就明白了我的企圖。
相同位不同則為1,相同則為0。
00101
11100
(^或者xor)
----------------
11001
運算結果
x <- x # y
y <- x @ y
x <- x @ y
執行了第一句后x變成了x # y。那么第二句實質就是y <- x # y @ y,由於#和@互為逆運算,那么此時的y變成了原來的x。第三句中x實際上被賦值為(x # y) @ x,如果#運算具有交換律,那么賦值后x就變成最初的y了。這三句話的結果是,x和y的位置互換了。
加法和減法互為逆運算,並且加法滿足交換律。把#換成+,把@換成-,我們可以寫出一個不需要臨時變量的swap過程(Pascal)。
#include<stdio.h>
int
main()
{
unsigned
short
a=100;
a=~a;
printf
(
"%d\n"
,a);
return
0;
}