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;
}
其實,對於這個小貼子的收尾,我不知所措,因爲我趕腳到,小精靈們的生命一直在跳躍着,催促着我們去發現,體味和欣賞。