將給定的二進位制數轉換為等效的 ASCII 字串的程式
在這個問題中,我們需要將二進位制字串轉換為字元字串。我們可以先將二進位制字串轉換為 ASCII 數字字串,然後可以轉換字元字串。
問題陳述 – 我們給定一個二進位制字串 bin_str,其大小是 8 的倍數。我們需要將二進位制字串轉換為字元字串。
示例
輸入
bin_str = "0110110001101010"
輸出
'lj'
解釋 – ‘01101100’ 等於十進位制的 108,這等於 ‘l’ 的 ASCII 值。
‘01101010’ 等於 106,而 ‘j’ 具有相同的 ASCII 值。
輸入
bin_str = "1000001100101110011111010010";
輸出
'AKOR'
解釋
‘01000001’ = 65 -> char(65) = A
‘01001011’ = 75 -> char(75) = K
‘01001111’ = 79 -> char(79) = O
‘01010010’ = 82 -> char(82) = R
輸入
bin_str = ‘’000111000111’
輸出
Not possible.
解釋 – 由於 bin_str 不是 8 的倍數,因此無法將二進位制字串轉換為字元字串。
方法 1
在這種方法中,我們將從 bin_str 中獲取長度為 8 的子字串並將其轉換為十進位制值。之後,我們將根據 ASCII 值將十進位制值轉換為字元。
演算法
步驟 1 – 將 bin_str 的長度儲存在 bin_len 變數中。
步驟 2 – 如果 bin_len 的值不是 8 的倍數,則返回 ‘不可能’。
步驟 3 – 定義 final_str 來儲存字元字串並開始遍歷二進位制字串。
步驟 4 – 從當前索引獲取長度為 8 的子字串,並執行 binTODec() 函式將二進位制字串轉換為十進位制值。
步驟 4.1 – 在 binToDec() 函式中,定義 dec_value 變數並初始化為零。此外,將 ‘base’ 變數初始化為 1,表示當前基數。
步驟 4.2 – 反向遍歷二進位制字串。如果第 p 個索引處的字元為 ‘1’,則將基數新增到 ‘dec_value’ 變數中。
步驟 4.3 – 將基數乘以 2。
步驟 4.4 – 返回 ‘dec_value’ 變數的值。
步驟 5 – 獲取二進位制字串的十進位制值後,使用 char() 將十進位制值強制轉換為字元,並將其追加到 final_Str 字串中。
步驟 6 – 返回 final_Str 字串。
示例
#include <bits/stdc++.h> using namespace std; int binToDec(string bin_str) { // For storing the resultant decimal value int dec_value = 0; // base case int base = 1; int str_len = bin_str.length(); for (int p = str_len - 1; p >= 0; p--) { // Add base value for every 1 if (bin_str[p] == '1') dec_value += base; // Multiply the base by 2 base = base * 2; } // Return decimal value return dec_value; } string CovertBinToAscii(string bin_str) { // Get length int bin_len = int(bin_str.size()); // Check whether the length is divisible by 8 or not if (bin_len % 8 != 0) { return "Not Possible!"; } string final_str = ""; // Traverse string for (int p = 0; p < bin_len; p += 8) { int decimal = binToDec((bin_str.substr(p, 8))); // Convert decimal to char and append to the final string final_str += char(decimal); } // Return Answer return final_str; } int main() { string bin_str = "0110110001101010"; cout << "The resultant alphanumeric string is - " << CovertBinToAscii(bin_str); return 0; }
輸出
The resultant alphanumeric string is - lj
時間複雜度 – O(N),因為我們遍歷二進位制字串並將其轉換為十進位制數。
空間複雜度 – O(N) 用於儲存最終字串。
方法 2
在這種方法中,我們將使用位操作將二進位制字串轉換為十進位制,並在獲得十進位制值後,我們將十進位制值轉換為 ASCII 字元。
演算法
步驟 1 – 定義 ‘final_Str’ 變數以儲存最終字串。
步驟 2 – 開始遍歷二進位制字串。在迴圈中,定義 ‘dec_value’ 並初始化為每次迭代的 0。
步驟 3 – 使用巢狀迴圈進行 8 次迭代。
步驟 4 – 將十進位制值左移 1 位。
步驟 5 – 對十進位制值與 (bin_str[p + q] - '0') 進行 OR 操作,它將是 0 或 1。
步驟 6 – 巢狀迴圈迭代完成後,將十進位制值強制轉換為 char 並將其追加到 final_str 字串中。
步驟 7 – 列印 final_str 字串的值。
示例
讓我們透過示例輸入瞭解下面的示例。
從 ‘0011000101000010’ 中,字串的前 8 位是 ‘00110001’。
最初,dec_value 為 00000000。
在第一次迭代中,它保持不變,當我們對 ‘0’ - ‘0’ = ‘0’ 進行 OR 操作時,它保持不變。
在第二次迭代中,它保持不變;在第三次迭代中,它發生變化,因為我們對 ‘1’ - ‘0’ 與 dec_value 進行 OR 操作。結果字串將是 00000001。
在第四次迭代中,它透過左移變為 00000010,當我們對 ‘1’ 進行 OR 操作時,它變為 00000011。
透過進行 8 次迭代,我們可以獲得單個字元的十進位制值,我們需要找到每個字元。
#include <iostream> #include <string> using namespace std; int main() { string bin_str = "0011000101000010"; string final_str = ""; // Traverse the binary string for (int p = 0; p < bin_str.size(); p += 8) { int dec_value = 0; // Iterate the next 8 bits for (int q = 0; q < 8; q++) { // Left shift decimal value by 1 to build a base dec_value <<= 1; // Perfor OR operation dec_value |= (bin_str[p + q] - '0'); } // Int to char type casting final_str += static_cast<char>(dec_value); } cout << "The resultant alphanumeric string is - " << final_str; return 0; }
輸出
The resultant alphanumeric string is - 1B
時間複雜度 – O(N),因為我們遍歷二進位制字串。
空間複雜度 – O(N),因為我們儲存字元字串。
在以上兩種解決方案中,第二種解決方案更快,因為它透過操縱位值將二進位制轉換為十進位制。位運算總是比其他運算更快。