تحويل مجموعة من الأرقام العشرية إلى مجموعة من الأرقام الثنائية

StackOverflow https://stackoverflow.com/questions/1657014

  •  11-09-2019
  •  | 
  •  

سؤال

ربما هذا هو سؤال غريب للغاية.

مشكلتي هي كما يلي:

تتيح لك آلة حاسبة الرسوم البيانية TI 83+ برنامجها على استخدام إما التجمع وكابل الارتباط إلى جهاز كمبيوتر أو لغة البرمجة TI-Basic المدمجة.

وفقا لما وجدته، فإنه يدعم الأعداد الصحيحة 16 بت فقط وبعض العوامات المحفوظة.

أريد أن أعمل بأرقام أكبر قليلا (حوالي 64 بت)، لذلك لاستخدام مجموعة مع أرقام واحدة:

{1, 2, 3, 4, 5}

سيكون العشري 12345.

في ثنائي، هذا 110000 00111001، أو كصفيف أرقام ثنائي:

{1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1}

التي ستكون كيف تعرضها الآلة الحاسبة.

كيف سأذهب حول تحويل هذه الصفيف من الأرقام العشرية (التي هي كبيرة جدا بالنسبة للآلة الحاسبة لعرضها كنوع أصلي) في صفيف من الأرقام العشرية؟

الكفاءة ليست مشكلة. هذه ليست الواجبات المنزلية.

هذا من شأنه أن يتركني مجانا في تنفيذ إضافة هذه المصفوفات ومثلها.

شكرا!

هل كانت مفيدة؟

المحلول

فكرت في الأمر وأعتقد أنني سأفعل ذلك مع الخوارزمية التالية

  • تحقق من الرقم الأخير (5 في حالة المثال)
  • إذا كان غريبا، تخزن (من الترتيب العكسي) 1 في الصفيف الثنائي

  • الآن قسم الرقم بحلول 2 من خلال الطريقة التالية:

  • تبدأ مع الرقم الأول ومسح متغير "Carry".
  • قسمها بنسبة 2 وإضافة متغير "Carry". إذا كان الباقي هو 1 (تحقق من ذلك قبل أن تقوم بالتقسيم مع و & 1) ثم ضع 5 في الحمل
  • كرر حتى تم إجراء جميع الأرقام

كرر كلا الخطوتين مرة أخرى حتى يتم تقليل الرقم بأكمله إلى 0.

الرقم في صفيفك الثنائية هو التمثيل الثنائي

مثالك: 1،2،3،4،5

  • The 5 غريب، لذلك نحن تخزن 1 في الصفيف الثنائي: 1
  • نحن نقسم الصفيف بنسبة 2 باستخدام الخوارزمية:
  • 0,2,3,4,5 => 0,1+5,3,4,5 => 0,6,1,4,5 => 0,6,1,2+5,5 => 0,6,1,7,2

ثم كرر:

0،6،1،7،2 الرقم الأخير هو حتى تخزين 0: 0،1 (إشعار نقوم بملء السلسلة الثنائية من اليمين إلى اليسار)

إلخ

ينتهي بك الأمر مع ثنائي

تحرير: فقط للتوضيح أعلاه: كل ما أقوم به هو الخوارزمية القديمة العمر:

 int value=12345;
 while(value>0)
 {
      binaryArray.push(value&1);
      value>>=1;     //divide by 2
 }

إلا في المثال الخاص بك ليس لدينا int ولكن مجموعة تمثل INT (10 قاعدة)؛ ^)

نصائح أخرى

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

قد تجد أنه مفيد من حيث ترتيب المعالجة لتخزين الأرقام الخاصة بك في النموذج العكسي (بحيث تأتي الأرقام الأقل أهمية أولا في الصفيف).

على الطريق هو تحويل كل رقم في التمثيل العشري إلى التمثيل الثنائي الخاص به الأمر ثم إضافة التمثيل الثنائي لجميع الأرقام:

5 = 101
40 = 101000
300 = 100101100
2000 = 11111010000
10000 = 10011100010000

             101
          101000
       100101100
     11111010000
+ 10011100010000
----------------
  11000000111001

إثبات مفهوم في C #:

طرق للتحويل إلى مجموعة من الأرقام الثنائية، إضافة صفائف وتضاعف صفيف من قبل عشرة:

private static byte[] GetBinary(int value) {
  int bit = 1, len = 1;
  while (bit * 2 < value) {
    bit <<= 1;
    len++;
  }
  byte[] result = new byte[len];
  for (int i = 0; value > 0;i++ ) {
    if (value >= bit) {
      value -= bit;
      result[i] = 1;
    }
    bit >>= 1;
  }
  return result;
}

private static byte[] Add(byte[] a, byte[] b) {
  byte[] result = new byte[Math.Max(a.Length, b.Length) + 1];
  int carry = 0;
  for (int i = 1; i <= result.Length; i++) {
    if (i <= a.Length) carry += a[a.Length - i];
    if (i <= b.Length) carry += b[b.Length - i];
    result[result.Length - i] = (byte)(carry & 1);
    carry >>= 1;
  }
  if (result[0] == 0) {
    byte[] shorter = new byte[result.Length - 1];
    Array.Copy(result, 1, shorter, 0, shorter.Length);
    result = shorter;
  }
  return result;
}

private static byte[] Mul2(byte[] a, int exp) {
  byte[] result = new byte[a.Length + exp];
  Array.Copy(a, result, a.Length);
  return result;
}

private static byte[] Mul10(byte[] a, int exp) {
  for (int i = 0; i < exp; i++) {
    a = Add(Mul2(a, 3), Mul2(a, 1));
  }
  return a;
}

تحويل صفيف:

byte[] digits = { 1, 2, 3, 4, 5 };

byte[][] bin = new byte[digits.Length][];
int exp = 0;
for (int i = digits.Length - 1; i >= 0; i--) {
  bin[i] = Mul10(GetBinary(digits[i]), exp);
  exp++;
}
byte[] result = null;
foreach (byte[] digit in bin) {
  result = result == null ? digit: Add(result, digit);
}

// output array
Console.WriteLine(
  result.Aggregate(
    new StringBuilder(),
    (s, n) => s.Append(s.Length == 0 ? "" : ",").Append(n)
  ).ToString()
);

انتاج:

1,1,0,0,0,0,0,0,1,1,1,0,0,1

يحرر:
طرق إضافية لضرب صفيف من عشرات. إنتدا عن ضرب الرقم قبل تحويله إلى مجموعة ثنائية، يجب القيام به إلى الصفيف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top