第一部分 進製
一、基本概念
進製就是不同的計數方式,預設情況下寫的數字都是十進位制的。
(1)二進位制:逢2進製,0b或0b開頭
int number2 = 0b1100;
(2)十進位制:逢10進製
int number = 12;
(3)八進位制:逢8進製,0開頭
int number3 = 014;
(4)十六進製制:逢16進製,0x或0x開頭
int number4 = 0xc;
二、進製的轉換(我們需要掌握的是2進製與10進製之間的轉換)(1)二進位制轉換成十進位制
0b1100 = 0 * 2的0次方 + 0 * 2的1次方 + 1 * 2的2次方+ 1 * 2的3次方
= 0 + 0 + 4 + 8 = 12
0b1111 = 1 + 2 + 4 + 8 = 15
(2)十進位制轉換成二進位制
67 = 64 + 2 + 1 = 2的6次方 + 2的1次方 + 2的0次方
= 0b1000000 + 0b10 + 0b1
= 0b1000011
(3)n位進製的取值範圍
2位二進位制位的取值範圍:0~3 0~2的2次方-1
3位二進位制位的取值範圍:0~7 0~2的3次方-1
n位二進位制位的取值範圍:0~2的n次方-1
(4)負數在記憶體中的儲存
負數在計算機中以補碼的形式儲存。
1> 原碼:原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其餘位表示值。例如
+1原碼:0000 0000 0000 0000 0000 0000 0000 0001
-1原碼:1000 0000 0000 0000 0000 0000 0000 0001
2> 反碼:正數的反碼是其本身,負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反。
+1反碼:0000 0000 0000 0000 0000 0000 0000 0001
-1反碼:1111 1111 1111 1111 1111 1111 1111 1110
3> 補碼:正數的補碼就是其本身,負數的補碼是在其原碼的基礎上,符號位不變,其餘各位取反,最後+1(即在反碼的基礎上+1)。
+1補碼:0000 0000 0000 0000 0000 0000 0000 0001
-1補碼:1111 1111 1111 1111 1111 1111 1111 1111
三、不同資料型別在記憶體中的儲存細節
int a = -10;
char c = 'a';
(1)負數在記憶體中是以補碼表示的,所以-10的二進位制是:
-10原碼:1000 0000 0000 0000 0000 0000 0000 1010
-10反碼:1111 1111 1111 1111 1111 1111 1111 0101
-10補碼:1111 1111 1111 1111 1111 1111 1111 0110
(2)字元在記憶體實際是以整型儲存的,通過acsii碼表,'a'對應的是65,char型別佔乙個位元組,所以二進位制是:
65 = 0b0100 0001
(3)記憶體儲存示意圖
四、型別說明符(在mac系統下)
(1)修飾長度
short:2位元組
long:8位元組
long long:8位元組
(2)修飾符號位
signed:最高位當符號位,取值範圍:2的-31次方~2的31次方-1
unsigned:最高位不當符號位,取值範圍:0~2的32次方-1
(3)補充格式符
%d\%i 十進位制形式輸出整數
%c 輸出字元
%p 輸出位址
%f 輸出小數
%s 輸出乙個或多個字元
%o 八進位制形式輸出整數
%x 十六進製制形式輸出整數
%e 以標準指數形式輸出單、雙精度浮點數,數字部分小數字為6位
五、char型別在儲存中的儲存(1)字元在記憶體實際是以整型儲存的,字元佔是1個位元組,8位二進位的取值範圍是:-128~127。
(2)操作的int資料如果在-128~127範圍內,那麼可以用char型別代替int,這樣做的目的是省記憶體。
char c = 'a';
printf("%d\n", c); //65
printf("%c\n", 67); //c
char c2 = 'a' + 33;
printf("%c - %d\n", c2, c2); //b - 98
第二部分 位運算一、按位與 &(1)只有對應的兩個二進位均為1時,結果位才為1,否則為0。
(2)二進位制中,與1相&就保持原位,與0相&就為0。
二、按位或 |
只要對應的兩個二進位有乙個為1時,結果位就為1,否則為0。
三、按位異或 ^
(1)當對應的二進位相異(不相同)時,結果為1,否則為0。
(2)規律:
1> 相同整數相^的結果是0。比如5^5=0。
2> 多個整數相^的結果跟順序無關。比如5^6^7=5^7^6
3> 因此得出結論:a^b^a = b
(3)利用異或交換兩個變數的值,不實用第三方變數。
int main(void)
四、按位取反 ~對整數a的各二進位進行取反,符號位也取反(0變1,1變0)。
五、左移 a << n
000 0000 0000 0000 0000 0000 0000 10010 9<<1
00 0000 0000 0000 0000 0000 0000 100100 9<<2
9<<1 -> 9 * 2的1次方 == 18
9<<2 -> 9 * 2的2次方 == 36
如果需要計算乘以2的n次方時,用左移,提公升效能。
六、右移 a >> n
00000 0000 0000 0000 0000 0000 0000 100 8>>1
000000 0000 0000 0000 0000 0000 0000 10 8>>2
0000000 0000 0000 0000 0000 0000 0000 1 8>>3
8>>1 -> 8/2的1次方 == 4
8>>2 -> 8/2的2次方 == 2
8>>3 -> 8/2的3次方 == 1
如果需要計算除以2的n次方時,用右移。
c語言位運算 C語言學習筆記(二)位運算
這一節主要說的是位運算,計算機中的執行速度 位運算 加減 乘除 求餘 位運算就是將數字轉換成二進位制後進行運算,之後再將數字轉換成原來的進製 與運算 當兩個數相與時,只有都為l的時候結果才為1,其餘情況結果都為0,符號 include int main 這個程式可以判斷a是偶數還是奇數,輸出為1說明...
C語言學習 位運算
原碼 就是前面所介紹的二進位制定點表示法,即最高位為符號位,0 表示正,1 表示負,其餘位表示數值的大小。反碼 表示法規定 正數的反碼與其原碼相同 負數的反碼是對其原碼逐位取反,但符號位除外。補碼 表示法規定 正數的補碼與其原碼相同 負數的補碼是在其反碼的末位加 1 補碼是為了表示乙個負數的二進位制...
c語言 進製和位運算
一.進製 十進位制轉n進製 連除倒取餘.以 10 為例,不同進製的表示方法 十進位制 10 二進位制 0b1010 八進位制 010 十六進製制 0x10 int a 100 printf o a 如何輸出進製數 d 十進位制 o 八進位制 0x 十六進製制 位運算子 按位與 按位或 按位非 按位異...