the beauty of C++
9月21日,對本文從格式到部分內(nèi)容上都進行了修改另外,鑒于某些轉(zhuǎn)載沒有注明出處,考慮到版權(quán)問題,特聲明如下:作者:翼帆@cppblog 原文地址:http://www.shnenglu.com/xiaoyisnail/archive/2009/09/19/96707.html本文版權(quán)歸作者和cppblog共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。 今天看了一位師兄去年的筆經(jīng)總結(jié),其中有一題是“不許用%和/來實現(xiàn)求任意數(shù)除以3的余數(shù)”,我想考官的目的應(yīng)該是想考察學(xué)生對位運算的熟悉程度吧,于是我把題目擴展成“只能用+,-和位運算實現(xiàn)正整數(shù)除法(/)和取模(%)”,注意:這里不能使用其它的庫例程來輔助計算,如log,log10等。在思考這道題目的過程中,我又涉及到了許多二進制相關(guān)的題目,如: 判斷給定的整數(shù)是不是2的整數(shù)次冪 判斷給定的整數(shù)是不是4的整數(shù)次冪 求給定整數(shù)的二進制表示中1的個數(shù) 求給定整數(shù)的二進制表示中0的個數(shù) 求給定整數(shù)的二進制表示中最高位1的位置 求大于等于給定整數(shù)的最小的2的整數(shù)次冪 求給定整數(shù)的二進制表示的有效位數(shù) ... 9月21日補充:這里只考慮值為正整數(shù)的情況。 這些題目都是經(jīng)典老題,頻繁出現(xiàn)于各類筆試面試題中,除了能考察位運算外,還能考察應(yīng)聘者能否給出創(chuàng)新的算法來更好地解決問題。可以說這些題目都不難,如果使用32位的int來表示整數(shù)的話,蠻力法都可以比較好地完成任務(wù),但是如果想盡可能地提高效率,那就需要動一番腦經(jīng)了。下面給出我對這些問題的整理和C++實現(xiàn),并在下次的文章中給出只用+,-和位運算實現(xiàn)的正整數(shù)除法和取模。 從某種意義上講,特別是從充分利用底層硬件的計算能力(利用特殊的cpu指令)來看,這些解法肯定不是最優(yōu)的,所以還希望大俠們多多指點。 判斷給定的整數(shù)是不是2的整數(shù)次冪 這應(yīng)該是最簡單的,利用最高位是1,其后所有位為0的特性,常數(shù)時間解決問題:
posted on 2009-09-19 13:58 翼帆 閱讀(8297) 評論(3) 編輯 收藏 引用 所屬分類: 算法
那么n|=n-1就把n的二進制表示中最低位1后的所有0置1,再加上1,那么就把最低位1左移了一位。 假設(shè)n=0x1100,那么n-1 = 0x1011, n | (n - 1) = 0x1111.跟你上面描述不一致. 回復(fù) 更多評論
總結(jié)的不錯 回復(fù) 更多評論
求給定整數(shù)的二進制表示的有效位數(shù) 可以binary search最高位置1的位置 int get_leftmost_set_bit(unsigned int n) { int l, u, m, t1, t2; l = 0; u = sizeof(int) * 8 - 1; while (l <= u) { m = l + (u - l)/2; t1 = n & (~((1 << m) - 1)); t2 = n & (~((1 << (m + 1)) - 1)); if (t1 && !t2) { return m; } else if (t1 && t2) { l = m + 1; } else { u = m - 1; } } return -1; } 回復(fù) 更多評論