1x10 ^ 49 في عشري - كيف البتات الثنائية هي وكيف يمكنك تحويلها إلى ثنائي؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

لقد واجهت موقعا إلكترونيا يستخدم معرفا عددا صحيحا بنسبة 50 رقما في سلسلة استعلام URL، والذي يبدو مفرطا قليلا.

أصغر عدد عشري رقمي من 50 رقما هو 1.0 x 10^49, ، والمعروف باسم:

1000000000
0000000000
0000000000
0000000000
0000000000
  1. كم عدد البتات التي تحتوي على التمثيل الثنائي؟
  2. كيف تقترب من تحويل هذا الرقم العشري الكبير إلى ثنائي، مع الأخذ في الاعتبار حدود النطاق للأعداد الصحيحة غير الموحدة 32 بت أو أعداد صحيحة 64 بت؟

أسأل عن فضول مبرمج نقي فقط - هذا ليس سؤالا جامعي ومشكلة عمل أو لغز مقابلة!

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

المحلول

  1. 49 * سجل (10) / سجل (2) = 162.774477، لذلك سيحتوي التمثيل الثنائي على 163 بت.

  2. استخدام فئة bigint وتطبيق الخوارزمية القياسية للتحويل من عشري إلى ثنائي.

نصائح أخرى

يمكن العثور على الحد الأدنى من التمثيل الثنائي (مع الدقة الصحيحة) عن طريق إجراء السجل (قاعدة 2) من الرقم. في هذه الحالة، سيتم تسجيل الحد الأدنى من البتات الثنائية (10 ^ 49) = 162.77. نحتاج إلى عدد صحيح حتى نسميها فقط 163 بت.

إذا اضطررت إلى تمثيل هذا الرقم، وكان الدقة في تمثيل نقطة عائمة غير كافية، أود فقط استخدام بعض biginteger. مكتبة.

لأن كل رقم عشري ينقل نفس المعلومات lb 10 البتات، أي عدد 50 رقما سوف يصلح ceil(lb(10)*50) = 167 بت.

على وجه التحديد، ليس من الصعب التحويل من عشري إلى ثنائي، حتى باليد. مجرد تقسيم اثنين، ووضع المعدذ (1 إذا كان الرقم الأخير غريب، 0 إذا حتى الآن) في نهاية النتيجة الثنائية الخاصة بك. إذا كنت بحاجة إلى هذه الأرقام العالية في البرنامج، فما عليك سوى استخدام التنفيذ الصحيح الكبير من النظام الأساسي، على سبيل المثال BigInteger في جاوة وعادل int في بيثون. في غياب ذلك، ابحث عن مكتبة عددي.

أوه، و 10 ^ 49 في ثنائي هو 163 بت طويلة:

110
1101 0111 1001 1111 1000 0010 0011 0010
1000 1110 1010 0011 1101 1010 0110 0001
1110 0000 0110 0110 1110 1011 1011 0010
1111 1000 1000 1010 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 0000

يمكن للمرء استخدام مكتبة معالجة Longinteger المناسبة لتحويل هذه الأرقام. إذا لم يسمح باستخدام المصدر، فيمكن أن يقدم المصدر معرفة مفيدة بكيفية القيام بهذه الأشياء بكفاءة.

فيما يتعلق بعدد البتات التي تحتاجها فقط لحل المعادلة:

2ن = 1050

أخذ سجل2 كلا الجزأين:

ن = تسجيل الدخول21050

الآن تحويل سجل2 لتسجيل الدخول10:

ن = تسجيل الدخول21050 = تسجيل الدخول101050/سجل102 = 50 / سجل102

خذ عدد صحيح (CEAL) التالي (CEAL) N - هذا هو عدد البتات المطلوبة.

1) 2 ^ 10 ~ 10 ^ 3 حتى 10 ^ 48 ~ 2 ^ 160؛ 10 ^ 49 ستكون كمية 164 بت.

2) استخدم فئة Biginteger أو MPI (التي يوجد بها الكثير مما يجب العثور عليه إذا لم تأتي مكتبة API القياسية لغتك). كيلوث لديه التفاصيل.

كنت أستخدم لغة رفيعة المستوى تعامل مع الأعداد الصحيحة الكبيرة بالنسبة لي. جلسة عينة irb (روبي):

>> (10**49).to_s
=> "10000000000000000000000000000000000000000000000000"
>> (10**49).to_s(2)
=> "1101101011110011111100000100011001010001110101000111101101001100001111000000110011011101011101100101111100010001010000000000000000000000000000000000000000000000000"
>> (10**49).to_s(2).size
=> 163

ماذا تقصد بالضبط عن طريق تخزين عدد X؟

  1. هل تعني تخزين جميع الأرقام بين 0 و X؟
  2. أو جميع الأرقام بين -x و x؟
  3. أو تخزين المعلومات فقط: NULL / X.

شعوري الأمعاء هو ربما كان المقرض للمقابلات هو الثالث. الجواب سيكون 1 بت.

تتراوح الأعداد الصحيحة العشرية 50 رقما من 10 ^ 49 إلى 10 ^ 50-1. 10 ^ 49 هو 163 بت، و 10 ^ 50-1 هو 167 بت. إذا كنت تريد العدد الدقيق من البتات، فأنت بحاجة إلى أخذ لوغاريتم هذه الأرقام الكبيرة مباشرة، بدلا من حساب سجل "الاختصار" فقط 50 *10(2).

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

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