程式設計菜鳥到大佬之路:C語言程式(十二)
第十二天學習精要
遞迴初步
遞迴
- 一個函式,自己呼叫自己,就是遞迴。
# include <iostream>
using namespace std;
int factorial(int n) // 函式返回n的階乘
{
if (n == 1)
{
return 1; // 終止條件
}
else
{
return n * factorial(n - 1);
}
return 0;
}
int main()
{
cout << factorial(5) << endl;
}
-
遞迴函式需要有終止條件,否則就會無窮遞迴導致程式無法終止甚至崩潰
-
求斐波那契數列第 n 項
# include <iostream>
using namespace std;
int Fibonacci(int n)
{
if (n < 3)
return 1;
else
return Fibonacci(n - 1) +Fibonacci(n - 2);
}
int main()
{
cout << Fibonacci(7) << endl;
}
位運算
基本概念
-
位運算:用於對整數型別(int,char,long 等)變數中的某一位(bit),或者若干位進行操作
- 判斷某一位是否為1。
- 只改變其中某一位,而保持其他位都不變。
-
C/C++語言提供了六種位運算子來進行位運算操作:
- &:按位與(雙目)。
- |:按位或(雙目)。
- ^:按位異或(雙目)。
- ~:按位非(取反)(單目)。
- <<:左移(雙目)。
- >>:右移(雙目)。
按位與 “&”
-
將參與運算的兩運算元各對應的二進位制位進行與操作,只有對應的兩個二進位均為1時,結果的對應二進位制位才為1,否則為0。
-
例如:表示式“21 & 18 ” 的計算結果是16(即二進位制數10000),因為:
- 21 用二進位制表示就是:
0000 0000 0000 0000 0000 0000 0001 0101 - 18 用二進位制表示就是:
0000 0000 0000 0000 0000 0000 0001 0010 - 二者按位與所得結果是:
0000 0000 0000 0000 0000 0000 0001 0000
- 21 用二進位制表示就是:
-
通常用來將某變數中的某些位清0且同時保留其他位不變,也可以用來獲取某變數中的某一位。
按位或 “|”
-
將參與運算的兩運算元各對應的二進位制位進行或操作,只有對應的兩個二進位都為0時,結果的對應二進位制位才是0,否則為1。
-
例如:表示式“21 | 18 ” 的值是23,因為:
- 21: 0000 0000 0000 0000 0000 0000 0001 0101
- 18: 0000 0000 0000 0000 0000 0000 0001 0010
- 21|18: 0000 0000 0000 0000 0000 0000 0001 0111
-
按位或運算通常用來將某變數中的某些位置1且保留其他位不變。
按位異或 “^”
-
將參與運算的兩運算元各對應的二進位制位進行異或操作,即只有對應的兩個二進位不相同時,結果的對應二進位制位才是1,否則為0。
-
例如:表示式“21 ^ 18 ” 的值是7(即二進位制數111)。
- 21:0000 0000 0000 0000 0000 0000 0001 0101
- 18:0000 0000 0000 0000 0000 0000 0001 0010
- 21^18:0000 0000 0000 0000 0000 0000 0000 0111
-
按位異或運算通常用來將某變數中的某些位取反,且保留其他位不變。
-
異或運算的特點是:如果 a ^ b = c,那麼就有 c ^ b = a以及c ^ a = b。 (窮舉法可證),此規律可以用來進行最簡單的加密和解密。
-
異或運算還能實現不通過臨時變數,就能交換兩個變數的值:
- int a = 5, b = 7;
- a = a ^ b;
- b = b ^ a;
- a = a ^ b;
- 即實現a,b值交換。
- 窮舉法可證。
按位非 “~”
-
按位非運算子“~” 是單目運算子。
-
其功能是將運算元中的二進位制位0變成1,1變成0。
左移運算子 “<<”
-
表示式:a << b的值是:將a各二進位全部左移b位後得到的值。左移時,高位丟棄,低位補0。 a 的值不因運算而改變。
-
例如:9 << 4
- 9的二進位制形式:
0000 0000 0000 0000 0000 0000 0000 1001 - 因此,表示式“9<<4” 的值,就是將上面的二進位制數左移4位,得:
0000 0000 0000 0000 0000 0000 1001 0000 - 即為十進位制的144。
- 9的二進位制形式:
-
實際上,左移1位,就等於是乘以2,左移n位,就等於是乘以 。而左移操作比乘法操作快得多。
右移運算子 “>>”
-
表示式:a >> b的值是:將a各二進位全部右移b位後得到的值。右移時,移出最右邊
的位就被丟棄。 a 的值不因運算而改變。 -
對於有符號數,如long,int,short,char型別變數,在右移時,符號位(即最高位)將一起移動,並且大多數C/C++編譯器規定,如果原符號位為1,則右移時高位就補充1,原符號位為0,則右移時高位就補充0。
-
實際上,右移n位,就相當於左運算元除以2n,並且將結果往小裡取整。
- -25 >> 4 = -2
- -2 >> 4 = -1
- 18 >> 4 = 1
思考題
- 有兩個int型的變數a和n(0 <= n <= 31),要求寫一個表示式,使該表示式的值和a的第n位相同。
- ( a >> n ) & 1
- (a & (1 << n )) >> n