一些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;
}
相关文章推荐
- C语言 一些算法
- C语言中,关于&,^,!布尔代数,移位操作的一些巧妙算法
- 一些小算法技巧
- C语言printf()函数中一些不为人知的技巧!
- 【编程 C】 对C语言编译初级算法的一些心得---函数(1)
- c/c++ 奇技淫巧(一些c语言的技巧)
- 分享一下 本人现在在学习C语言 谁有学好C语言的一些技巧 多谢
- c语言的一些技巧
- 获取C语言中的最大值(正无穷)与最小值(负无穷)的一些方法与技巧
- C语言系列(四):最近重拾C语言的想法,谈到C中易错点,难点;以及开源代码中C语言的一些常用技巧,以及如何利用define、typedef、const等写健壮的C程序
- C语言在单片机开发中的一些技巧
- 自己最近写的一些c语言的串的算法
- C语言中一些非常酷的技巧(cool tricks)
- 设计技巧15:模板方法 Template Method 在一个方法中定义一个算法的骨架,而将一些步骤延迟的子类中,实现Ioc
- 嵌入式C语言的一些特点与技巧集锦
- 一些C语言中字符串的算法问题解决实例小结
- 自己做的demo---c语言的基本语法,过阵子可以重新写一些算法跟数据结构了
- 一些基本的调试技巧--C语言(二)
- 一些技巧算法
- C语言系列(一):最近重拾C语言的想法,谈到C中易错点,难点;以及开源代码中C语言的一些常用技巧,以及如何利用define、typedef、const等写健壮的C程序