程式設計知識進制
17個蘋果,有4種表示方式,它們表示同一個數值:
計算驗證:
十進制: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轉換成八進制:
将二進制從右到左,每三個分成一組:
結果就是1565;
-
舉例2:
将二進制0b01101110101轉換成十六進制:
将二進制從右到左,每四個分成一組:
結果就是375;
-
舉例3:
将十六進制0xABC1轉換成二進制:
将十六進制從右到左,每個分成四位:
結果就是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是高位。
在記憶體中的存儲方式有兩種
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
- 置位和清位在後面寄存器的操作中,會經常使用。