二进制数转整数、整数转二进制数、二进制数求模
1、整數轉二進制數
//將一個int型整數轉換為二進制數 string itob(int number) {string binNum;while (number){binNum += '0' + number%2;number /= 2;}reverse(binNum.begin(), binNum.end());return binNum; }如果需要二進制數高位補零,或者是正負數轉換的二進制數有符號位,則可以對以上代碼稍作處理。
2、二進制數轉整數
//方法一:將一個二進制數轉換為int型整數(不考慮有符號位的情況) int btoi(string binNum) {int ret = 0;for (auto x : binNum)ret = ret * 2 + (x - '0');return ret; }當然你也可以從二進制的低位開始算起(就像教科書里將一個二進制數化為整數那樣),如下
//方法二:將一個二進制數轉換為int型整數(不考慮有符號位的情況) int btoi(string binNum) {int ret = 0;for (int i = binNum.size() - 1; i >= 0; i--)ret += (binNum[i] - '0') * pow(2, binNum.size() - i - 1);return ret; }兩種方法都可以實現目的,但是在對二進制求模的時候會稍有區別,繼續往下面看。
3、二進制求模
現在有個問題:有兩個二進制字符串binStr1、binStr2,要求你用binStr1對binStr2求模,結果還是用二進制字符串形式返回,你會怎么做?
當然,最容易想到的也最簡單的方式,就是利用我們上面寫的btoi和itob函數,現將這兩個二進制字符串轉換為整數,然后整數用%求余,結果再用itob函數轉換為二進制字符串返回,完美!
那你真的是很聰明了!我現在加大難度,假如說binStr1這個二進制串非常非常長,表示的整數遠遠超過了int甚至是long long類型所能表示的范圍;也就是說這個整數計算機它存儲不了!(當然binStr2表示的范圍沒有那么變態,因為對binStr2求模的結果可能需要用計算機表示出來)。那這個時候我還讓你求出這個模的結果(求模的結果用二進制串或者整數類型表示都可以),你會怎么辦?
我們先來看一下二進制求模的時候是什么樣子的吧。假如我們需要求10011110(158) 對1010(10)的模:
余數1000(8)即所求的結果。
其實我們演示的這個二進制除法過程跟十進制除法是一樣的。當然我們受此啟發,如果按照這個過程對binStr1和binStr2進行處理,求他們模的結果,應該說也不是不可以,只是這樣會特別麻煩。
如果我們對這個過程繼續深入探究的話,我們將會發現一些端倪!!
看除法的過程是怎么做的??對于被除數二進制串,不停的往后走,直到找到一個大于等于除數二進制串的數,第一次找到的是10011,對除數1010作除法得到余數1001,然后拿到被除數的下一位組成10011,繼續對除數1010作除法,得到余數1001,然后繼續往下面進行..........
如果我們不用處理二進制字符串的方法進行求余數,而是在這個過程中用整數求余的方式進行,不是也完美避免了因為二進制數過大而導致的計算機不能表示帶來的死結嘛?
直接上代碼,給出一個直觀的理解:求一個二進制串表示的大整數對另一個整數求模的結果,結果用十進制整數返回
/**function:求一個二進制串表示的大整數對另一個整數求模的結果,結果用十進制整數返回假設:二進制串表示的大整數是bigBinNum,對mod求模。**/ #define MOD mod int binaryMod(string bigBinNum) {int ret = 0;for (auto x : bigBinNum)ret = (ret * 2 + x - '0') % MOD;return ret; }這里的代碼流程跟上面二進制轉整數方法一里面的方法是一樣的,只是稍稍多加了一個求模的功能。
在刷LeetCode的時候遇到這個小問題(求一個二進制串表示的大整數對另一個整數求模的結果,結果用十進制整數返回),在此稍作總結,以便以后可以隨時復習查看。
?
總結
以上是生活随笔為你收集整理的二进制数转整数、整数转二进制数、二进制数求模的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android-弹窗AlterDialo
- 下一篇: 测试工具Monitor入门