Cho một chuỗi chứa số nhị phân. Mục tiêu là tìm số thập phân tương đương bằng phương pháp đệ quy.
Số nhị phân chuyển sang thập phân: Duyệt từ LSB (bit thấp) đến MSB (bit cao), nhân mỗi bit với 2^i (0≤i≤số bit) và cộng dồn.
Các trường hợp đầu vào/đầu ra
Đầu vào - binStr[] = "110010"
Đầu ra - Thập phân tương đương: 50
Giải thích - 110010₂ = 0×2⁰ + 1×2¹ + 0×2² + 0×2³ + 1×2⁴ + 1×2⁵ = 0+2+0+0+16+32 = 50.
Đầu vào - binStr[] = "0011"
Đầu ra - Thập phân tương đương: 3
Giải thích - 0011₂ = 1×2⁰ + 1×2¹ + 0×2² + 0×2³ = 1+2+0+0 = 3.
Phương pháp sử dụng trong chương trình dưới đây
Dùng hàm đệ quy bintoDecimal(strBin, length) nhận chuỗi và độ dài. Với mỗi ký tự chuyển sang thập phân, nhân với 2^(len-i-1) (dùng dịch bit <<), cộng kết quả đệ quy của các bit sau.
Nhập chuỗi strBin[] chứa số nhị phân.
Tính độ dài bằng strlen(strBin).
Hàm bintoDecimal(char binary[], int len, int i=0) trả về số thập phân.
Nếu i == len-1 (bit cuối/LSB) trả về binary[i]-'0' (nhân 1 = 2⁰).
Ngược lại: temp = binary[i]-'0'; temp <<= len-i-1; temp += bintoDecimal(binary, len, i+1); return temp.
In kết quả trong main.
Ví dụ mã
#include<bits/stdc++.h> using namespace std; int bintoDecimal(char binary[],int len, int i=0){ if (i == len-1) return (binary[i] - '0'); int temp=binary[i]-'0'; temp=temp<<len-i-1; temp=temp+bintoDecimal(binary,len,i+1); return (temp); } int main(){ char strBin[] = "11010"; int length=strlen(strBin); cout <<"Thập phân tương đương của nhị phân: "<<bintoDecimal(strBin,length) << endl; return 0; }
Đầu ra
Nếu chạy mã trên sẽ cho kết quả:
Thập phân tương đương của nhị phân: 26