C C 深度分析(二)

2022-08-17 18:21:16 字數 1695 閱讀 7667

第二章 位運算

在數字解碼與編碼的過程中,位運算的操作是司空見慣的事,同時位運算在提高程式的效能方面也獨占鰲頭,因此位運算操作是必需要深入了解的問題。

在乘法以及除法的操作中我可以使用未執行來提高**的質量,例如:a = a * 16;這種操作完全可以替換為:a = a << 4;我們知道左移一位相當於將原數乘以2,左移n位則相當於乘以2^n,前提是在沒有發生溢位的情況下;故上例即相當於將數a左移4位,對於某些乘以非2的整數冪情況,如 a = a * 9;則可以改寫為a = (a << 3) + a; 同理右移相當於除以2的整數冪,當然以上所有情況都是在沒有發生資料溢位的情況下,因此位運算操作要格外的小心,否則極有可能發生出錯的情況。

在資料型別轉換的過程中也需要做位運算操作,例如我們想將乙個unsigned short型別的資料存入unsigned char型別的陣列中,就需要進行位運算,首先分析知道unsigned short占用16個位元組,unsigned char占用8個位元組,想要將大位元組的資料存入小位元組,必須要對大位元組進行分割,即將高8位與低8為分離開來分別存放,來看實現**:

unsigned char * drawcompo_pj_bt_change(unsigned short *subarray)

else

}temp[i] = '\0';

return temp;

}temp[i] = (unsigned char)( (subarray[i] & 0xff00) >> 8);即取subarray[i]資料的高8位,temp[i++] = (unsigned char)(subarray[i] & 0x00ff);取低8位。這樣就可以實現將高位元組的資料完整的存入到低位元組中。

位運算還可以用來判斷變數的符號,我們知道對於乙個有符號的變數,其最高位為其符號位,故檢查改變的最高位即可知道該變數為正還是為負。看一段**:

int main()

else

return 0;

}對於想要交換兩個數的值的時候,通常我們的做法如下:

void swap(int &data1, int &data2)

這樣的**比較簡單易懂,然而美中不足的是它會產生乙個臨時變數temp,接下來我們用位運算來重寫這個程式;

void swap(int &data1, int &data2)

從上面的**我們可以看出少了乙個臨時變數,同時也加快了**的執行效率。

尾遞迴:

遞迴呼叫給我們帶來了很多方便,也簡化了**,使程式看起來更加的簡潔和明了,但遞迴呼叫也通常伴隨著乙個潛在的危險:出棧,接下來我們來看乙個常見的遞迴。

int factorial(int n)

else

}通常在求乙個數的階乘的時候我們習慣於採用上述方法,然而分析來看當輸入的n值較大時,factorial(n-1)*n所計算的值會不斷的壓入堆疊,生成很多的臨時變數,等待下乙個的值的確定才得以計算,然而在記憶體中堆疊的大小是固定的,當輸入的n值很大時,極有可能產生堆疊溢位!因此,有乙個好的方法解決這種問題即尾遞迴呼叫。接下來我們來看這種強大的演算法。

int factorial(int n, int m)

else

}從**中可以看出,通過引入乙個新的引數m來存放每次遞迴所產生的值,這樣就避免了每次遞迴都要進行壓棧操作,也就不會產生堆疊溢位的現象,而且普通的遞迴每次遞迴只能等待下一次遞迴得到的結果後才能繼續運算,而尾遞迴每次執行都會進行運算,一次迴圈執行完畢即可得到結果,其時間複雜度為o(n);

C C 深度分析(一)

table page 10 int main value addvalue addvalue.val 1 2 addvalue.val 2 4 int result 0 result page 0 unisetfunc addvalue printf the result of add is d n...

二分查詢深度分析

總結一句話就是 思路很簡單,細節是魔鬼,hhhh。本部落格 幾個最常用的二分查詢場景 尋找乙個數 尋找左側邊界 尋找右側邊界。public int binarysearch int nums,int target return 1 答 舉個例子推一下即可得知。因為當left 4,right 6時,此...

位元幣深度分析

最近電視 新聞 經常有講到位元幣,但普通人經常被位元幣的各種資訊搞得一頭霧水,到底什麼是位元幣,它是誰開發的,它跟q幣有什麼區別,它是不是乙個龐氏 它是不是乙個擊鼓傳花的遊戲,它會不會很容易就收到控制,等等。在這裡,我試圖從各個層面進行 用一些通俗易懂的表達,來還原乙個真實的位元幣。我將以類似答疑的...