C/C++里面的运算符只是那个语言系统里面的一个基础小集合,但是作用却无可替代;因为它们是基础性的东西,所以看起来比较平淡,常常在运算符所操纵的类型需要小心谨慎的时候能够得到小心对待,在C++中也会因为需要运算符重载的情境而变得复杂。但是,个人赶脚,在普通应用中,运算符们有时候也像小精灵一样,有着令人耳目清新的生命力。
很多人的经验中,C/C++能够高效优雅地执行一些运算,比如位移运算,从而可以对消耗较高的运算——如乘除法,执行效率上的优化。那么,我们来点点三个小精灵吧。
- 位与——"&"
《编程之美》中有这样一道小题:给定一个字节长的无符号整形数,求其二进制中“1”的个数。
然后就有一个简洁的函数来完成:
int count(BYTE v)
{
int num = 0;
while(v)
{
v &= (v - 1);
++num;
}
return num;
}
值得玩味吧?怎么办到的,怎么想到的......纸上比画比画就明朗了。
- 异或——"^"
现在有两个整数x和y,我们需要交换它们的值,写个以指针或者引用作参数的swap( )函数吗?经典!但是下面的做法又如何?
x = x^y;
y = x^y;
x = x^y;
《ComputerSystems.A Programmer's Perspective》教导我们:这不能带来什么性能上的优异,但是提供了一种新的方法,多一条路,世界更宽敞了。但是,异或的生命力不单在开拓这个新思路上,强烈的赶脚......但是,我还没想到好的例子
- 逻辑与——"&&"
有这么一道小题:请写一个函数——int print_num(int k){}; 要求函数功能为打印k的降序,直到0结束,即如果k=5,便打印:5 4 3 2 1 0
要求: 不能用 if, if else, switch, ?: , while, for , do while, goto 语句
看看逻辑与是怎么华丽地完成任务的吧!
int print_num(int k)
{
printf("%d",k);
k && print_num(k - 1);
return k;
}
其实,对于这个小贴子的收尾,我不知所措,因为我赶脚到,小精灵们的生命一直在跳跃着,催促着我们去发现,体味和欣赏。