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