二進制基礎


一.計算機中為什么要用二進制

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)=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)= (11001)2

     1011

  + 1110 

   11001

 

(2).二進制數的減法

   法則: 0—0 = 0

1—0 = 1

0—1 = 1(有借位)

          1—1 = 0

   例:(1101)—(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) /(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)=(204)10

小數:(1000001.01)=(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)=(2E9A)16

 

  (2)  16        2

   例:(2E9A)16 =(10111010011010)2

 

3.十進制數與十六進制數之間的轉換

  (1) 10       16

       “除十六取余” “下高上底”

  或:10      2      16

      (228)10=(11100100)=(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相關知識有很大的好處。

 

含義  

Pascal語言

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)。

procedure swap(var a,b:longint);
begin
a:=a + b;
b:=a - b;
a:=a - b;
end;
  好了,剛才不是說xor的逆運算是它本身嗎?於是我們就有了一個看起來非常詭異的swap過程:
procedure swap(var a,b:longint);
begin
a:=a xor b;
b:=a xor b;
a:=a xor b;
end;
  注意:位運算版本的交換兩數不適用於一個數的自我交換。也就是說,如果上述程序的“b”改成“a”的話,其結果是變量a變成零。因此,在使用快速排序時,由於涉及到一個數的自我交換,因此如果要在其中使用位運算版的交換兩數的話,應該先判斷。具體的時間損耗在此略過。
=== 4. not運算 ~ ===
not運算的定義是把內存中的0和1全部取反。使用not運算時要格外小心,你需要注意整數類型有沒有符號。如果not的對象是 無符號整數(不能表示負數),那么得到的值就是它與該類型 上界的差,因為無符號類型的數是用00到$FFFF依次表示的。下面的兩個程序(僅語言不同)均返回65435。
var
a:word;
begin
a:=100;
a:=not a;
writeln(a);
end.
 
#include<stdio.h>
int  main()
{
     unsigned  short  a=100;
     a=~a;
     printf ( "%d\n" ,a);
     return  0;
}
 
  如果not的對象是有符號的整數,情況就不一樣了,稍后我們會在“整數類型的儲存”小節中提到。
=== 5. shl運算 << ===
  a shl b就表示把a轉為二進制后左移b位(在后面添b個0)。例如100的二進制為1100100,而110010000轉成十進制是400,那么100 shl 2 = 400。可以看出,a shl b的值實際上就是a乘以2的b次方,因為在二進制數后添一個0就相當於該數乘以2。
  通常認為a shl 1比a * 2更快,因為前者是更底層一些的操作。因此程序中乘以2的操作請盡量用左移一位來代替。
  定義一些 常量可能會用到shl運算。你可以方便地用1 shl 16 - 1來表示65535。很多算法和數據結構要求數據規模必須是2的冪,此時可以用shl來定義Max_N等常量。
=== 6. shr運算 >> ===
  和shl相似,a shr b表示二進制右移b位(去掉末b位),相當於a除以2的b次方(取整)。我們也經常用shr 1來代替div 2,比如 二分查找、堆的插入操作等等。想辦法用shr代替除法運算可以使程序效率大大提高。最大公約數的二進制算法用除以2操作來代替慢得出奇的mod運算,效率可以提高60%。
 
下面列舉了一些常見的二進制位的變換操作。
功能 | 示例 | 位運算
----------------------+---------------------------+--------------------
去掉最后一位 | (101101->10110) | x shr 1
在最后加一個0 | (101101->1011010) | x shl 1
在最后加一個1 | (101101->1011011) | x shl 1+1
把最后一位變成1 | (101100->101101) | x or 1
把最后一位變成0 | (101101->101100) | x or 1-1
最后一位取反 | (101101->101100) | x xor 1
把右數第k位變成1 | (101001->101101,k=3) | x or (1 shl (k-1))
把右數第k位變成0 | (101101->101001,k=3) | x and not (1 shl (k-1))
右數第k位取反 | (101001->101101,k=3) | x xor (1 shl (k-1))
取末三位 | (1101101->101) | x and 7
取末k位 | (1101101->1101,k=5) | x and(1 shl k-1)
取右數第k位 | (1101101->1,k=4) | x shr (k-1) and 1
把末k位變成1 | (101001->101111,k=4) | x or (1 shl k-1)
末k位取反 | (101001->100110,k=4) | x xor (1 shl k-1)
把右邊連續的1變成0 | (100101111->100100000) | x and (x+1)
把右起第一個0變成1 | (100101111->100111111) | x or (x+1)
把右邊連續的0變成1 | (11011000->11011111) | x or (x-1)
取右邊連續的1 | (100101111->1111) | (x xor (x+1)) shr 1
去掉右起第一個1的左邊 | (100101000->1000) | x and (x xor (x-1))(或 x and (-x))


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM