位運算 優化運算速度

作者: 陳躍峰  來源: CSDN  發布時間: 2010-09-26 17:21  閱讀: 5225 次  推薦: 1   原文鏈接   [收藏]  

  位運算在語言基礎學習中比較枯燥,所以很多學生朋友未深入學習,也沒有實際應用該基礎知識,但是在實際的項目開發中,位運算由于其運算的速度優勢,在很多的領域被廣泛應用,所以在實際的招聘考試中,位運算的考題比較常見。

  題目:請寫出求2的3次方最快的方法。

  答案A:2x2x2

  答案B:1 << 3

  題目答案:B

  為什么答案是B? 答案A是計算2的3次方的數學方法,通過十進制運算方式實現題目要求的結果,但是在執行效率上無法滿足題目的要求。為什么這種方法無法滿足題目的要求呢?這就要從計算機的運算模式說起了。

  計算機的運算模式是以二進制為基礎,所以十進制運算在計算時會被轉換成二進制再進行運算,而轉換過程就會導致運行速度降低。計算2的3次方最快的方法應該是使用位運算中的移位運算符,通過二進制移位實現,這種方法可以提高運算速度。通過這個題目,考官既考查了應聘者是否對程序的執行效率有深刻的認識,也考查應聘者是否具備位運算的相關知識。位運算在程序開發中非常常見,合理使用位運算可以提高程序的執行效率,所以我們平時使用的軟件大多數都用到了位運算操作。下面我們來看看位運算操作在實際開發中是如何被應用的。

  位運算存儲數據

  利用位運算存儲數據,主要是為了減少程序占用的內存。以int數據為例子,如果按照十進制的方式存儲數據,一個32位的int變量只能存儲一個數值,而如果使用二進制方式存儲數據(缺點是只能存儲0或1兩個數據)則可以存儲32個數據,將極大的節約內存。例如,在一個int變量的從右側開始倒數第2位存儲數據,則存儲和讀取數據的代碼如下所示:

 
int bData = 0;
//存儲數值1 
bData = bData |(1 << (2 - 1));
//存儲數值0 
bData = bData & (~(1 << (2 - 1));
//讀取數據 
int n = bData & (1 << (2 - 1));

  點評:在該代碼中,將需要存儲的數據(0或1)存儲在變量bData的倒數第二位中,所以在存儲時,則只需要將倒數第二位的數值改變,其他位的數值不改變即可。所以在存儲1時,不論bData的數值是多少,只需要和二進制數據10進行位或運算就可以將倒數第二位置1,而需要存儲0時,則需要bData和0xfffffffd進行位與運算,即可達到清零倒數第二位的目的。

  需要注意的是,有些可能會認為在存儲數值0時,會使用如下的代碼實現:

 
bData = bData |(0 << (2 - 1));

  其實這樣是錯誤的,因為0無論左移多少位都還是0,這樣在進行位或運算時,0和1位或得到的結果會是1,無法實現設置對應的位為0的目的,所以需要使用以上的代碼進行實現。

  異或位運算簡單加密

  利用位運算的計算速度快,以及異或的特性(和同一個數字異或兩次還是自身),可以用來簡單加密數據,且加解密的速度會非常快。這種加密方式強度比較低,但是可以用于一般的加解密任務。例如,假設密匙是數字123,則加解密一個byte數組的代碼如下:

 
byte[] b = {1,2,3,5,6};
byte key = 123;
//依次加密的代碼 
for(int i = 0;i < b.length;i++){
b[i]
= (byte)(b[i] ^ key); //利用異或加密 
}
//解密的代碼 
for(int i = 0;i < b.length;i++){
b[i]
= (byte)(b[i] ^ key); //利用異或解密
}

  點評:在該代碼中,對數組b使用密匙key進行加密,加密的過程是將數組b中每個元素和key進行異或,加密以后的數據可以在實際應用中進行存儲或網絡傳輸,而解密時的操作和加密時一樣,使用這種簡單的加密方式雖然保密性不高,但是加解密的速度確實是很值得稱贊的。

1
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()