二進制基礎

一.計算機中爲何要用二進制java

1.計算機中一個數是用電子器件的「開」和「關」來表示的,即二進制的「1」和「0」。算法

2.二進制運算法則簡單。如加法:0+0=0,0+1=1+0=1,1+1=10 (3個公式)而十進制加法法則需記55個公式。數據結構

3.二進制是計算機中採用的基本數制;而八進制和十六進制用做二進制的壓縮形式;十進制是理解其餘數制的基礎。學習

  如:串行通信接口COM1口的輸入輸出端口地址用 03F8-03FF(十六進制數)表示 。加密

二.四種進位計數制的基數、位權和權值spa

   進位計數制是一種數的表示方法,它按進位的方式來計數,簡稱爲進位制。設計

1. 十進制的基數是10,10個數字符號,0、一、二、三、四、五、六、七、八、9code

     進位規則:逢10進1htm

         例:(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、一、二、三、四、五、六、

                                  七、八、九、A、B、C、D、E、F

     進位規則:逢16進1

         例:(2AF)16 =2*162+A*161+F*160 =(687)10

                                  162    161     160       是十六進制的位權

                                           256   16      1     權值

四、八進制基數是8,8個數字符號,0、一、二、三、四、五、六、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

 5、二進制的位運算(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))
相關文章
相關標籤/搜索