التحويل من النظام الثنائي إلى النظام العشري

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث

يمكن تحويل الأعداد من النظام الثنائي Binary System إلى النظام العشري Decimal System عن طريق استخراج الأرقام من العدد الثنائي المعطى بدءًا من جهة اليمين وضرب كل رقم بالعدد 2 مرفوعًا للأسّ المناسب لكل مرتبة، وتخزين النتيجة في متغير.

فعلى سبيل المثال:

لو أردنا تحويل العدد الثنائي 111 إلى النظام العشري، فإنّ النتيجة ستكون:

dec_value = 1*(2^2) + 1*(2^1) + 1*(2^0) = 7

يوضّح المخطط التالي طريقة تحويل العدد (1010) إلى النظام العشري:


تنفيذ الخوارزمية

يمكن تحويل الأعداد من النظام الثنائي إلى النظام العشري بطريقتين هما التكرارية والتعاودية.

الطريقة التكرارية

  • C++‎:
#include <iostream> 
using namespace std; 

int binaryToDecimal(int n) 
{ 
	int num = n; 
	int dec_value = 0; 

	// تهيئة القيمة الأساسية لتكون 1 والتي تساوي 2^0
	int base = 1; 

	int temp = num; 
	while (temp) { 
		int last_digit = temp % 10; 
		temp = temp / 10; 

		dec_value += last_digit * base; 

		base = base * 2; 
	} 

	return dec_value; 
} 

// اختبار الدالة السابقة
int main() 
{ 
	int num = 10101001; 

	cout << binaryToDecimal(num) << endl; 
}
  • بايثون:
def binaryToDecimal(n): 
	num = n; 
	dec_value = 0; 
	
	# تهيئة القيمة الأساسية لتكون 1 والتي تساوي 2^0
	base = 1; 
	
	temp = num; 
	while(temp): 
		last_digit = temp % 10; 
		temp = int(temp / 10); 
		
		dec_value += last_digit * base; 
		base = base * 2; 
	return dec_value; 

# اختبار الدالة السابقة
num = 10101001; 
print(binaryToDecimal(num));
  • جافا:
class GFG { 
	static int binaryToDecimal(int n) 
	{ 
		int num = n; 
		int dec_value = 0; 

		// تهيئة القيمة الأساسية لتكون 1 والتي تساوي 2^0 
		int base = 1; 

		int temp = num; 
		while (temp > 0) { 
			int last_digit = temp % 10; 
			temp = temp / 10; 

			dec_value += last_digit * base; 

			base = base * 2; 
		} 

		return dec_value; 
	} 

	// اختبار الدالة السابقة
	public static void main(String[] args) 
	{ 
		int num = 10101001; 
		System.out.println(binaryToDecimal(num)); 
	} 
}

تعمل الشيفرة السابقة مع الأعداد الثنائي ضمن نطاق الأعداد الصحيحة integers. إن كان المطلوب تحويل أعداد كبيرة جدًّا من نوع long مثل ‎20 bit‎ أو ‎30 bit‎ فيمكن استخدام متغير نصّي لتخزين الأعداد الثنائية.

  • C++‎:
#include <iostream> 
#include <string> 
using namespace std; 

int binaryToDecimal(string n) 
{ 
	string num = n; 
	int dec_value = 0; 

	int base = 1; 

	int len = num.length(); 
	for (int i = len - 1; i >= 0; i--) { 
		if (num[i] == '1') 
			dec_value += base; 
		base = base * 2; 
	} 

	return dec_value; 
} 

int main() 
{ 
	string num = "10101001"; 
	cout << binaryToDecimal(num) << endl; 
}
  • بايثون:
def binaryToDecimal(n): 
	num = n; 
	dec_value = 0; 
	
	base1 = 1; 
	
	len1 = len(num); 
	for i in range(len1 - 1, -1, -1): 
		if (num[i] == '1'):	 
			dec_value += base1; 
		base1 = base1 * 2; 
	
	return dec_value; 

num = "10101001"; 
print(binaryToDecimal(num));
  • جافا:
import java.io.*; 

class GFG { 

	static int binaryToDecimal(String n) 
	{ 
		String num = n; 
		int dec_value = 0; 

		int base = 1; 

		int len = num.length(); 
		for (int i = len - 1; i >= 0; i--) { 
			if (num.charAt(i) == '1') 
				dec_value += base; 
			base = base * 2; 
		} 

		return dec_value; 
	} 

	public static void main(String[] args) 
	{ 
		String num = new String("10101001"); 
		System.out.println(binaryToDecimal(num)); 
	} 
}

تعطي الشيفرات السابقة المعطيات التالية:

169

ملاحظة: يمكن الحصول على نفس النتيجة في لغة جافا باستخدام الدالة Integer.parseInt()‎:

public class GFG { 
    public static void main(String args[]) 
    { 
        String binaryNumber = "1001"; 
        System.out.println(Integer.parseInt(binaryNumber, 2)); 
    } 
}

الطريقة التعاودية

يمكن تحويل الطريقة التكرارية إلى طريقة تعاودية وتوضّح الأمثلة التالية ذلك:

  • C++‎:
#include<bits/stdc++.h> 
using namespace std; 

int toDecimal(string binary, int i=0) 
{ 
	// إن وصلنا إلى الحرف الأخير
	int n = binary.length(); 
	if (i == n-1) 
	return binary[i] - '0'; 
	
	// إضافة العنصر الحالي ثم استدعاء الدالة لنفسها مرة أخرى
	return ((binary[i] - '0') << (n-i-1)) + 
			toDecimal(binary, i+1); 
} 

// اختبار الشيفرة السابقة
int main() 
{ 
	string binary = "1010"; 
	cout << toDecimal(binary) << endl; 
	return 0; 
}
  • بايثون:
def toDecimal(binary, i = 0): 

	# إن وصلنا إلى الحرف الأخير
	n = len(binary) 
	if (i == n - 1) : 
		return int(binary[i]) - 0
	
	# إضافة العنصر الحالي واستدعاء الدالة لنفسها مرة أخرى
	return (((int(binary[i]) - 0) << (n - i - 1)) +
						toDecimal(binary, i + 1)) 

# اختبار الدالة السابقة
if __name__ == "__main__" : 
	
	binary = "1010"
	print(toDecimal(binary))
  • جافا:
class GFG 
{ 
	static int toDecimal(String binary,int i) 
	{ 
		// إن وصلنا إلى الحرف الأخير
		int n = binary.length(); 
		if (i == n-1) 
		return binary.charAt(i) - '0'; 
		
		// إضافة العنصر الحالي واستدعاء الدالة لنفسها مرة أخرى
		return ((binary.charAt(i) - '0') << (n-i-1)) + 
				toDecimal(binary, i+1); 
	} 
	
	// اختبار الدالة السابقة
	public static void main(String []args) 
	{ 
		String binary = "1010"; 
		int i=0; 
		System.out.println(toDecimal(binary,i)); 
		
	} 

}

مصادر