您的位置:首页 > 编程语言 > C语言/C++

一些C语言算法和技巧

2011-12-14 16:30 225 查看

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: