一些C語言演算法和技巧

來源:互聯網
上載者:User

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;

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.