اذهب إلى المحتوى

السؤال

نشر

أحاول أن أقوم بعمل برنامج يطبع عمر المستخدم بأكثر من نظام رقمي مثل النظام العشري decimal و الثماني octal والست عشري Hex decimal والثنائي binary:

 

std::cout << "Enter your age: ";
int age{};
std::cin >>  age;

std::cout << "Your age in decimal is " << std::dec << age << '\n';
std::cout << "Your age in HEX is "     << std::hex << age << '\n';
std::cout << "Your age in OCT is "     << std::oct << age << '\n';

المشكلة هي أنه لا يوجد معالج إخراج output manipulator لتحويل الرقم إلى نظام ثنائي، قمت بتجربة std::bin ولكن لم ينجح هذا الأمر.

كيف أقوم بطباعة الرقم إلى النظام الثنائي؟

Recommended Posts

  • 1
نشر

تدعم لغة ++C طباعة الأرقام بنظام ثماني وست عشري بدون مشكلة، ومع ذلك فإن طباعة الأرقام بالنظام الثماني تحتاج إلى بعض الخطوات الأضافية، تحتوي مكتبة ++C القياسية على الكائن std::bitset (موجود في ملف الترويسة header المسمى <bitset>) .

في البداية يجب أن تحدد للكائن std::binset عدد الـ bits التي سيقوم بتخزينها (يجب أن يكون هذا العدد من نوع compile time constant وليس run time constant) ثم تقوم بتمرير الرقم الذي تريد تحويله إلى النظام الثنائي، كالتالي:
 

#include <bitset>

// std::bitset< حجم ال bits > variable_name { unsigned int };
std::bitset<8> bin{ 13 };


// يمكن تمرير أرقام Hex و Oct و Binary أيضًا
std::bitset<8> bin2{ 0xd };
std::bitset<8> bin3{ 015 };
std::bitset<8> bin4{ 0b0000'1101 };
  

ملاحظة: الرقم الذي تريد تحويله إلى النظام الثنائي يجب أن يكون من نوع unsigned أي ليس له إشارة (موجب فقط)، لذلك تحتاج إلى إستخدام static_cast لتحويل نوع المتغير age عند طباعة الرقم

#include <iostream>
#include <bitset>

int main()
{
    std::cout << "Enter your age: ";
    int age{};
    std::cin >>  age;

    std::cout << "Your age in decimal is " << std::dec << age << '\n';
    std::cout << "Your age in HEX is "     << std::hex << age << '\n';
    std::cout << "Your age in OCT is "     << std::oct << age << '\n';

    // تحويل المتغير إلى unsigned
    unsigned int unsigned_age = static_cast<unsigned int>(age);
    std::cout << "Your age in Binary is " << std::bitset<8>{unsigned_age} << '\n';

    return 0;
}

وستكون النتيحة كالتالي:

Enter your age: 15
Your age in decimal is 15
Your age in HEX is f
Your age in OCT is 17
Your age in Binary is 00001111

يمكنك أيضًا تحويل المتغير age إلى unsinged ثم تحويله إلى كود Binary مباشرة دون تخزينه في متغير جديد:

// تحويل المتغير إلى unsigned وطباعته كنظام ثنائي
std::cout << "Your age in Binary is " << std::bitset<8>{static_cast<unsigned int>(age)} << '\n';
  • 0
نشر

يمكنك تنفيذ التالي بسهولة عبر إستخدام هيكل البيانات bitset والذي يقوم بتحويل الأرقام العشرية إلى ثنائية , حيث تقوم بوضع الرقم في الconstructor الخاص بالهيكل وثم تقوم بتحويله إلى نص وطباعته كما في المثال التالي

std::string binary = std::bitset<8>(128).to_string();
    std::cout<<binary<<"\n";

    unsigned long decimal = std::bitset<8>(binary).to_ulong();
    std::cout<<decimal<<"\n";

ﻻحظ أننا قمنا بإعطاء الbitset قيمة 8 مما يعني أنها تحمل 8 بيتات بمعنى أن أقصى رقم يمكن وضعه هو 2 مرفوع لقوى الرقم 8 -1 بما يعادل 255, إن أردت قيمة أكبر يمكنك إسناد خانات أكبر من البيتات

  • 0
نشر

يمكن تحويل العدد الصحيح لتمثيله في النظام الثنائي من خلال تكرار قسمته على 2 وفي كل مرة أخذ باقي القسمة على 2 كخرج للمرحلة، فيكون الخرج سلسلة 0و1 تعطينا التمثيل الثنائي.

باستخدام خوارزمية عودية:

  • تكرار الاستدعاء طالما n/2 ليس 0 (شرط التوقف)
  • استدعاء الدالة عودياً للخطوة التالية n/2
  • طباعة باقي قسمة n على 2 كنتيجة للخطوة الحالية
void convert_To_Binary(int n)
{
    if (n / 2 != 0) {
        convert_To_Binary(n / 2);
    }
    printf("%d", n % 2);
}

في الحل السابق، لانضطر لعكس جهة البتات المشكلة للعدد لأن تعليمة الطباعة للخطوة الحالية سيتم تنفيذها لاحقاً بعد انتهاء الاستدعاءات العودية 

ويمكن الحل باستخدام حلقة:

  • r سلسلة الجواب وستكون من 0 و 1
  • ثم حلقة طالما n لا تساوي 0 سنكرر الخطوات:
    • حساب قيمة باقي قسمة العدد n على 2
    • إضافة قيمة السلسلة النصية المؤقتة للإجابة
    • قسمة العدد n على 2 
  • إعادة r
std::string to_Binary(int n)
{
  std::string r;
  while(n!=0) {
    std::string tmp = (n%2==0 ?"0":"1");
    r=+temp; 
    n/=2;
  }
  return r;
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...