位運算要點總結

下面是小米公司2013校園招聘筆試題的一道選擇題的第3題

參見Hackbuteer1的這篇博客http://blog.csdn.net/hackbuteer1/article/details/8484974    2013年小米校園招聘筆試題

3.運算(93&-8)的結果爲:  88


具體運算過程如下:

93 :  0x005D     0000 0000 0101 1101
-8 :   0xFFF8     1111   1111  1111  1000
-------------------------------------------------------
88       0x0058     0000  0000  0101 1000


其實二進制的位運算並不是很難掌握,因爲位運算總共只有5中運算:與(&)、或(|)、異或(^)、左移(<<)、右移(>>)。

與、或和異或運算的規律總結如下表所示:



左移運算符m<<n表示把m左移n位。左移n位的時候,最左邊的n位將被丟棄,同時在最右邊補上n個0。比如:

00001010<<2 = 00101000
100001010<<3 = 01010000

右移運算符m>>n表示把m右移n位。右移n位的時候,最右邊的n位將被丟棄。但右移時處理最左邊位的情形要稍微複雜一點。如果數字是一個無符號數值,
則用0填補最左邊的n位。如果數字是一個有符號的數值,則用數字的符號位填補最左邊的n位。也就是說如果數字原先是一個正數,則右移之後在最左邊補
n個0;如果數字原先是負數,則右移之後在最左邊補n個1。下面是對兩個8位有符號數作右移的例子:

00001010>>2 = 00000010
10001010>>3 = 11110001

還有一個規律是對於正數右移1位的結果相當於原來的數字除以2得到值,所以我們在編程中可以運用這個規律來提高程序的效率,因爲位運算是計算機
底層的運算,所以效率會很高的。當然左移1位相當於原來的數乘以2得到的值。

在編程中有許多問題我們可以通過位運算的規律來解決,有時既可以保證程序運行的效率,也可以很巧妙的解決編程問題。

關於位運算的一些編程題可以參見何海濤的《劍指offer 名企面試官精講典型編程題》一書的2.4.3 位運算 ,裏面的許多編程題都很經典,練習一下,不盡對
準備面試筆試很有幫助,對與編程能力的提過也是很有幫助的。


下面再看一道新穎的關於進制的題目
(阿里巴巴筆試題,本人在參加騰訊2014校園招聘的筆試題中也遇到了類似的題目。這種題在何海濤先生的《劍指offer 名企面試官精講典型編程題》中也有提到過
11、假設在n進制下,下面的等式成立,n值是() 567*456=150216
A、9                B、10                 C、12                     D、18


解題思路如下:(參考Hackbuteer1的博客http://blog.csdn.net/hackbuteer1/article/details/6902917)
這種題類似於2進制的解法。
假設是X進制,則567=7+6*X+5*X^2,456=6+5*X+4*X^2,所以564*456=(7+6*X+5*X^2)*(6+5*X+4*X^2)而150216=6+X+2*X^2+5*x^4+X^5,由於567*456=150216,則6+X+2*X^2+5*x^4+X^5=(7+6*X+5*X^2)*(6+5*X+4*X^2),最後解出來X=18


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章