有一個正整數(shù),請找出其二進(jìn)制表示中1的個數(shù)相同、且大小最接近的那兩個數(shù)。(一個略大,一個略小)
給定正整數(shù)int x,請返回一個vector,代表所求的兩個數(shù)(小的在前)。保證答案存在。
測試樣例:2返回:[1,4]題目分析: 對于這道題目,我覺得最重要的就是求一個數(shù)的二進(jìn)制表示中1的個數(shù)。關(guān)于求一個數(shù)的二進(jìn)制表示中1的個數(shù)會有很多種方法:方法1:與1求&運算,依次求出32個比特位中1的個數(shù)。(效率較低,無論多大的數(shù),都要循環(huán)32次)方法2:平行算法:相鄰的比特位求和,重復(fù)這個過程,直到最后只剩下一個位,就是該數(shù)的二進(jìn)制表示中1的個數(shù)。方法3:快速法,任何數(shù)和比它小1的數(shù)做&運算,結(jié)果都會比原來的數(shù)少一個1,這樣也是可以統(tǒng)計出1的個數(shù)。由于這是一種比較快速的方法,所以下面會使用這種辦法來求取1的個數(shù)?!咀⒁狻?p> 很多初學(xué)者,對于這個問題還會想到模除的辦法,但是模除這個方法,處理正數(shù)的時候沒有什么問題,但是處理負(fù)數(shù)的時候,就不對了,下邊給出測試代碼:void test(){ int x = -1; int count = 0; while (x) { if (x % 2 != 0) ++count; x /= 2; } cout << count << endl;}而實際上,-1的二進(jìn)制表示中含有32個1.所以,這種辦法就是錯誤的。好了,說了這么多,重點還是解決本題。下邊給出本題的實現(xiàn)代碼:實現(xiàn)代碼:class CloseNumber {public: int Count(int x) { int count = 0; while (x) { ++count; x = x & (x - 1); } return count; } vector<int> getCloseNumber(int x) { // write code here int countOne = Count(x); vector<int> ret; for (int i = x - 1; i > 0; --i) { if (Count(i) == countOne) { ret.push_back(i); break; } } for (int i = x + 1; ;++i) { if (Count(i) == countOne) { ret.push_back(i); break; } } return ret; }};題目二:題目描述
請編寫程序交換一個數(shù)的二進(jìn)制的奇數(shù)位和偶數(shù)位。(使用越少的指令越好)
給定一個int x,請返回交換后的數(shù)int。
測試樣例:10返回:5題目分析:如果我們可以得到一個數(shù)的奇數(shù)位和偶數(shù)位的值,然后進(jìn)行交換就可以了。得到奇數(shù)位的值和偶數(shù)位的值是比較簡單的。奇數(shù)位的值:給定數(shù)字&0xAAAAAAAA偶數(shù)位的值:給定數(shù)字&0x55555555交換的方法:奇數(shù)位的值右移一位,偶數(shù)位的值左移一位,兩者相加,得到結(jié)果。代碼實現(xiàn):class Exchange {public: int exchangeOddEven(int x) { // write code here int odd = (x & 0xAAAAAAAA);//換取x的奇數(shù)位信息 int even = (x & 0x55555555);//偶數(shù)位信息 return (odd >> 1) + (even << 1); }};題目三:題目描述
有一個介于0和1之間的實數(shù),類型為double,返回它的二進(jìn)制表示。如果該數(shù)字無法精確地用32位以內(nèi)的二進(jìn)制表示,返回“Error”。
給定一個double num,表示0到1的實數(shù),請返回一個string,代表該數(shù)的二進(jìn)制表示或者“Error”。
測試樣例:0.625返回:0.101題目分析:這個題目考查十進(jìn)制的小于1的正小數(shù)轉(zhuǎn)為二進(jìn)制數(shù)的辦法,這個學(xué)過計算機基礎(chǔ)的人都會轉(zhuǎn)化,就是連乘法,這里就不細(xì)說了。特別需要注意的是,浮點數(shù)與0進(jìn)行比較的方法,這個問題,前邊的文章也是總結(jié)過的。即就是這個數(shù)在無限接近于0的正小數(shù)和負(fù)小數(shù)之間,則就認(rèn)為是為0.具體請看下邊代碼中的表示方法。代碼實現(xiàn):class BinDecimal {public:#define exp pow(10,-7) string PRintBin(double num) { // write code here string ret; if (num >= 1) return ret; int count = 0; ret.push_back('0'); ret.push_back('.'); while (!(num > -exp && num < exp)) { num = num * 2; if (num >= 1.0) { ++count; ret.push_back('1'); num -= 1.0; } else { ++count; ret.push_back('0'); } if (count == 32){ return "Error"; } } return ret; }};【總結(jié)】1.浮點數(shù)與0進(jìn)行比較的方法,不可直接比較。2.十進(jìn)制小數(shù)轉(zhuǎn)換成二進(jìn)制小數(shù)的方法-----連乘法。3.一個數(shù)的二進(jìn)制表示中1的個數(shù)。4.如何得到一個數(shù)的奇數(shù)位和偶數(shù)位對應(yīng)的值---將數(shù)字和0xAAAAAAAA按位與,和0x55555555按位與。
新聞熱點
疑難解答