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);\
})另一說,花括號是爲了替換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;
}
一些C語言算法和技巧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.