天天看點

2位元組十六進制浮點數 qt_ARM裸機程式設計知識進制及知識位元組序_位操作程式設計知識進制程式設計知識位元組序_位操作

程式設計知識進制

17個蘋果,有4種表示方式,它們表示同一個數值:

2位元組十六進制浮點數 qt_ARM裸機程式設計知識進制及知識位元組序_位操作程式設計知識進制程式設計知識位元組序_位操作

計算驗證:

十進制:17=1x10^1 + 7x10^0;

二進制:17=1x2^4 + 0x2^3 + 0x2^2 + 0x2^1 + 1x2^0;

八進制:17=2x8^1 + 1x8^0;

十六進制:17=1x16^1 + 1x16^0;

為何引入二進制?

在硬體角度看,半導體隻有兩個狀态:on是1,off是0;

資料使用多個半導體進行表示,用二進制描述,吻合硬體狀态。

為何引入八進制?

将二進制的三位作為一組,把這一組作為一位進行表示,就是八進制。

為何引入十六進制?

将二進制的四位作為一組,把這一組作為一位進行表示,就是十六進制。八進制和十六進制友善我們描述,簡化了長度。

如何快速的轉換2/8/16進制:

首先記住8 4 2 1 ——>二進制權重

  • 舉例1:

    将二進制0b01101110101轉換成八進制:

    将二進制從右到左,每三個分成一組:

2位元組十六進制浮點數 qt_ARM裸機程式設計知識進制及知識位元組序_位操作程式設計知識進制程式設計知識位元組序_位操作

結果就是1565;

  • 舉例2:

    将二進制0b01101110101轉換成十六進制:

    将二進制從右到左,每四個分成一組:

2位元組十六進制浮點數 qt_ARM裸機程式設計知識進制及知識位元組序_位操作程式設計知識進制程式設計知識位元組序_位操作

結果就是375;

  • 舉例3:

    将十六進制0xABC1轉換成二進制:

    将十六進制從右到左,每個分成四位:

2位元組十六進制浮點數 qt_ARM裸機程式設計知識進制及知識位元組序_位操作程式設計知識進制程式設計知識位元組序_位操作

結果就是1010 1011 1100 0001;

在C語言中怎麼表示這些進制呢?十進制: int a = 96;八進制: int a = 0140;//0開頭十六進制: int a = 0x60;//0x開頭

用0b開頭表示二進制,約定俗成的規定。

程式設計知識位元組序_位操作

位元組序:

假設int a = 0x12345678;

前面說了16進制每位是4個位元組,在記憶體中,是以8個位元組作為1byte進行存儲的,是以0x12345678中每兩位作為1byte,其中0x78是低位,0x12是高位。

在記憶體中的存儲方式有兩種

2位元組十六進制浮點數 qt_ARM裸機程式設計知識進制及知識位元組序_位操作程式設計知識進制程式設計知識位元組序_位操作

0x12345678的低位(0x78)存在低位址,即方式1,叫做小位元組序(Little endian);

0x12345678的高位(0x12)存在低位址,即方式2,叫做大位元組序(Big endian);

一般的arm晶片都是小位元組序,對于2440可以設定某個寄存器,讓整個系統使用大位元組序或小位元組序,它預設使用小位元組序。

  • 位操作:移位

左移:

int a = 0x123; int b = a<<2;–> b=0x48C

右移:

int a = 0x123; int b = a>>2;–> b=0x48左移是乘4,右移是除4;

1、取反

  • 原來問0的位變1,原來為1的位變0;
  • int a = 0x123; int b = ~a;a=2

2、位與

  • 1 & 1 = 1
  • 1 & 0 = 0
  • 0 & 1 = 0
  • 0 & 0 = 0
  • int a = 0x123; int b = 0x456; int c = a&b;–> c=0x2

3、位或

  • 1 | 1 = 1
  • 1 | 0 = 1
  • 0 | 1 = 1
  • 0 | 0 = 0
  • int a = 0x123; int b = 0x456; int c = a|b;–> c=0x577

4、置位

  • 把a的bit7、8置位(變為1)
  • int a = 0x123; int b = a|(1<<7)|(1<<8);–> c=0x1a3

5、清位

  • 把a的bit7、8清位(變為0)
  • int a = 0x123; int b = (a& ~(1<<7))&(~(1<<8));–> c=0x23
  • 置位和清位在後面寄存器的操作中,會經常使用。