將給定的二進位制數轉換為等效的 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),因為我們儲存字元字串。

在以上兩種解決方案中,第二種解決方案更快,因為它透過操縱位值將二進位制轉換為十進位制。位運算總是比其他運算更快。

更新於: 2023-08-25

407 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告