/*------------------------------------------------------程式說明: 程式接收一個二進位字串,然後程式將其轉換成十進投師數字值表示 程式最多可以接收32位。-------------------------------------------------------*/#include<stdio.h>#include<string.h>#define MAXBIT 33long btoi(char *szBitStr, int BitLen) ;int main(void){intiNum = 0 ;char szBitStr[MAXBIT] ;int BitLen = 0 ;printf("Please enter the bit : ") ; //這裡居然寫成了sizeof。。。。gets(szBitStr) ;BitLen = strlen(szBitStr) ; //iNum = btoi(szBitStr,BitLen) ;printf("The int value : %ld\n",iNum) ;return 0 ;}long int btoi(char *szBitStr, int BitLen){int i = 0 ; //size_t 就是unsigned intint n = 0 ;long iResult = 0 ; long iSetBit = 1 ;int iOneBitPos[MAXBIT] ; //記錄為位1的位置的數組for(i = 0 ; i < BitLen ; i++){if('1' == szBitStr[i]){iOneBitPos[n++] = BitLen - i - 1 ;}}for(i = 0 ; i < n ; i++){iResult += (iSetBit << iOneBitPos[i]) | 0 ; //核心代碼 ,利用移位操作}return iResult ;}
總結一下:本來這一道題目是舍友在做的時候遇到了一點問題,問我是怎樣做的。當時的第一想法和宿友的想法一樣,就是寫一個雙重for迴圈,外層迴圈定位字串的每一位,內層迴圈決定乘以多少次2這樣。但是後面覺得這一章位於位操作那一塊,於是決定想一個向位元運算靠攏的方法,而且覺得第一個方法用雙重迴圈來做可能效率沒有那麼高。於是就寫了第二個方法。。。其實,核心代碼也沒有變多少。----------------------------------先來分析一下,第一個方法。在第一個方法中,我先假設字串的位元有n位( 0 < n <=32)第一個方法中,核心的那一部分應該是判斷定位的字元是否為'1'或 '0'。如果為0話,進行下一次迴圈,如果是1的話,則進行乘2運算,而且要根據索引的位置(低位、高位)來決定乘多少個2,或者移多少位。那麼,如果要看演算法的效率,就是看到底要重複執行多少次乘2操作。第一種方法中,假設最壞的情況是所有位都位1,外層迴圈肯定是n的,內層迴圈由於所有位都是1,所以也進行了n次乘2的操作。所以最壞的情況是O(n^2).而最好的情況當然是所有位為'0'啦,就只有外層迴圈起作用,所以最好的情況應該為O(n)。不知道可不可以這樣計平均:(n^2 + n)/2 = n(n+1)/2-----------------------------------而第二種方法裡面,我決定將內嵌迴圈的方法,拆到兩單獨的迴圈。第一個迴圈用來記錄,位是1的索引。第二個迴圈是根據第一個迴圈中記錄的索引,來進行位移操作。第一個迴圈,無論是最好還是最壞的情況,其時間複雜度應該是O(n),第二個迴圈最好的情況,應該是所有位為0,所以一次操作也不用進行,O(0)了。最壞的情況就是所有位都是1,但是時間複雜度也只有O(n)而已。所以,如果平均可以這樣計的話:(n + 0 + n + n)/2 = (3/2)n---------------------------------------------------------------------所以,當n大於2的時候,第二種方法就體現出優越性了。-----------------------------------無聊寫寫,大神莫噴。。。。。------------------------------------