C語言學習筆記 進製和位運算

2021-06-29 05:32:50 字數 3917 閱讀 7019

第一部分 進製

一、基本概念

進製就是不同的計數方式,預設情況下寫的數字都是十進位制的。

(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 十六進製制 位運算子 按位與 按位或 按位非 按位異...