一些C語言算法和技巧


1.不用第三變量,交換兩個變量的方法:

  a = a ^ b;
  b = a ^ b;
  a = a ^ b;  //( a ^ b ) ^ a == b
或者
  a = a + b;
  b = a - b;
  a = a - b;// (a + b) - a == b
(注:以上兩種方法不適應浮點型變量,表示方法和精度的原因)

2.計算一個變量裏‘1’的個數:

f(char   x){ 
for(int   i=0;   x;   x   &=   x-1,i++); 
return   i; 
}

解釋:假設 x 爲 11010100

 x-1  爲  11010011

      x & (x -1)爲  11010000 ,到這裏,我們發現結果不爲零,且少了一個1。所以一次循環少個1,記錄循環次數就行了。

 另外:一個數如果是2的n次冪,那麼他一定是1後加一些0,如1000, 1000000等。

那麼  x & (x - 1)的結果爲零,那麼他就是2的n次冪。


3.讓函數宏像函數一樣使用

/*以下是宏定義*/

#define MACRO(c)\
do {\
  if( c )\
  {\
         printf("hello!");  
  }\
}while(0)   //do-while語句while()後應有一個“;”,這裏有意捨去且條件永遠爲假,即內部語句只能執行一遍

/*以下是宏使用*/

MACRO(1);//此處的“;”看上去像語句末尾的分號,其實它是宏定義末尾捨去的分號,這樣的do-while宏使用起來就像函數了

4.不用 if 的類 if 語句

(void)(DLL_Exit == DLL_ZERO_INFO && fputs("Size of address record is zero.\n\n", stderr));

利用“&&”運算符的短路原理,前邊表達式的值能夠決定後邊的能否執行到。

5.花括號可以使宏得到返回值

會返回最後一條語句的賦值結果

#define even(x)\
({\
  int y = x;\
  (2*(y/2) == y ? y:y+1);\
})

http://topic.csdn.net/u/20091126/20/e05094ad-448e-41a6-a199-f3ca93d40c43.html?seed=222192752&r=79877196#r_79877196

另一說,花括號是爲了替換do{}while(0)語句,使宏使用後能加“;”。

猜想,花括號所代表的語句塊的值就是花括號內最後一條語句的值。(待驗證)

6. 函數型宏定義返回值

#include <stdio.h>

#define even(x, ret)\

{\  

int y = x;\

ret = (2*(y/2) == y ? y:y+1);\

}

int main(void)

{  

int ret;

int num = 10;  

even(num, ret);  

printf("num = %d\n", ret);  

num++;  

even(num, ret);  

printf("num = %d\n", ret);  

return 0;

}

發佈了9 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章