1. 程式人生 > >程式設計菜鳥到大佬之路:C語言程式(十二)

程式設計菜鳥到大佬之路: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
  • 通常用來將某變數中的某些位清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。
  • 實際上,左移1位,就等於是乘以2,左移n位,就等於是乘以 2 n 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