題目一:
有乙個正整數,請找出其二進位制表示中1的個數相同、且大小最接近的那兩個數。(乙個略大,乙個略小)
給定正整數int x,請返回乙個vector,代表所求的兩個數(小的在前)。保證答案存在。
測試樣例:
2返回:[1,4]
題目分析:
對於這道題目,我覺得最重要的就是求乙個數的二進位制表示中1的個數。
關於求乙個數的二進位制表示中1的個數會有很多種方法:
方法1:與1求&運算,依次求出32個位元位中1的個數。(效率較低,無論多大的數,都要迴圈32次)
方法3:快速法,任何數和比它小1的數做&運算,結果都會比原來的數少乙個1,這樣也是可以統計出1的個數。由於這是一種比較快速的方法,所以下面會使用這種辦法來求取1的個數。
【注意】
很多初學者,對於這個問題還會想到模除的辦法,但是模除這個方法,處理正數的時候沒有什麼問題,但是處理負數的時候,就不對了,下邊給出測試**:
void test()
cout << count << endl;
}
而實際上,-1的二進位制表示中含有32個1.所以,這種辦法就是錯誤的。
好了,說了這麼多,重點還是解決本題。下邊給出本題的實現**:
實現**:
class closenumber
return count;
}vectorgetclosenumber(int x)
}for (int i = x + 1; ;++i)
}return ret;
}};
題目二:
請編寫程式交換乙個數的二進位制的奇數字和偶數字。(使用越少的指令越好)
給定乙個int x,請返回交換後的數int。
測試樣例:
10返回:5
題目分析:
如果我們可以得到乙個數的奇數字和偶數字的值,然後進行交換就可以了。
得到奇數字的值和偶數字的值是比較簡單的。
奇數字的值:給定數字&0xaaaaaaaa
偶數字的值:給定數字&0x55555555
交換的方法:
奇數字的值右移一位,
偶數字的值左移一位,兩者相加,得到結果。
**實現:
class exchange
};
題目三:
有乙個介於0和1之間的實數,型別為double,返回它的二進位制表示。如果該數字無法精確地用32位以內的二進位制表示,返回「error」。
給定乙個double num,表示0到1的實數,請返回乙個string,代表該數的二進位制表示或者「error」。
測試樣例:
0.625返回:0.101
題目分析:
這個題目考查十進位制的小於1的正小數轉為二進位制數的辦法,這個學過計算機基礎的人都會轉化,就是連乘法,這裡就不細說了。
特別需要注意的是,浮點數與0進行比較的方法,這個問題,前邊的文章也是總結過的。即就是這個數在無限接近於0的正小數和負小數之間,則就認為是為0.具體請看下邊**中的表示方法。
**實現:
class bindecimal
else
if (count == 32)
}return ret;
}};
【總結】
1.浮點數與0進行比較的方法,不可直接比較。
2.十進位制小數轉換成二進位制小數的方法-----連乘法。
3.乙個數的二進位制表示中1的個數。
4.如何得到乙個數的奇數字和偶數字對應的值---將數字和0xaaaaaaaa按位與,和0x55555555按位與。
面試筆試題目總結
總結一下以前面試和筆試時的題目,找工作要用的,說不定哪天就又遇上了。1.鍊錶與陣列的區別 這個題目遇到了兩次 答 1 陣列要事前定義固定的長度,不能動態的刪減 2 鍊錶能動態的進行儲存分配,可以適應資料動態的增減情況,可以方便的插入刪除資料項 3 陣列從棧中分配空間,自由度小 4 鍊錶從堆中分配空間...
位運算的題目
nowcoder 乙個整型陣列裡除了兩個數字之外,其他的數字都出現了兩次,找出這兩個數。兩個不相等的元素在位級表示上必定會有一位存在不同,將陣列的所有元素異或得到的結果為不存在重複的兩個元素異或的結果。diff diff 得到出 diff 最右側不為 0 的位,也就是不存在重複的兩個元素在位級表示上...
面試中常見的位運算題目
a 11111111111111111111111110000001 b 2 a b 11111111111111111111111111100000 a b 00111111111111111111111111100000 題目 給出乙個整數n,求其二進位制表示中1的個數。思路 1.每次根據技巧一...