سؤال

أنا فقط فضولي إذا كان هناك سبب لماذا من أجل تمثيل -1 في ثنائي، يتم استخدام مكملين اثنين: التقليب البتات وإضافة 1؟

-1 يمثل 11111111 (مكملا لشخصين) بدلا من (بالنسبة لي أكثر بديهية) 10000001 وهو ثنائي 1 مع البتة الأولى كما العلم السلبي.

إخلاء المسئولية: أنا لا أعتمد على الحساب الثنائي لعملي!

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

المحلول

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

قل لديك رقمين و 2 و -1. في طريقة "بديهية" لتمثيل الأرقام، سيكونون 0010 و 1001, ، على التوالي (أنا أتلقى 4 بت من أجل الحجم). بطريقة مكملة اثنين، هم 0010 و 1111. وبعد الآن، دعنا نقول أنني أريد إضافتها.

إضافة مكملتين بسيطة للغاية. يمكنك إضافة أرقام بشكل طبيعي وأي بت إجراءات في النهاية. لذلك تمت إضافتهم على النحو التالي:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 هو 1، وهو النتيجة المتوقعة "2 + (- 1)".

ولكن في طريقة "بديهية"، إضافة أكثر تعقيدا:

  0010
+ 1001
= 1011

ما هو -3، أليس كذلك؟ إضافة بسيطة لا تعمل في هذه الحالة. تحتاج إلى ملاحظة أن أحد الأرقام سالبة ويستخدم خوارزمية مختلفة إذا كان هذا هو الحال.

بالنسبة إلى طريقة التخزين "البديهية"، تعد الطرح عملية مختلفة من الإضافة، مما يتطلب إجراءات إضافية على الأرقام قبل إضافة. نظرا لأنك تريد أن تكون العمليات الأساسية (الجمع والطرح، إلخ) أن تكون أسرع وقت ممكن، تحتاج إلى تخزين الأرقام بطريقة تتيح لك استخدام أبسط الخوارزميات الممكنة.

بالإضافة إلى ذلك، في طريقة التخزين "البديهية"، هناك فصيران:

0000  "zero"
1000  "negative zero"

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

هناك مكافأة أخرى مع تخزين INTS بهذه الطريقة، وهذا عندما تحتاج إلى تمديد عرض السجل يتم تخزين القيمة. مع تكمل اثنين، تخزين رقم 4 بت في سجل 8 بت هو مسألة تكرارها البت الأكثر أهمية:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

إنها مجرد مسألة النظر إلى بت تسجيل الدخول من الكلمة الأصغر وتكرارها حتى يصادف عرض Word Bigger Word.

مع طريقتك، ستحتاج إلى مسح بت الموجودة، وهي عملية إضافية بالإضافة إلى الحشو:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

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

نصائح أخرى

ويكيبيديا يقول كل شيء:

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

بمعنى آخر، مضيفا هو نفسه، Wether أم لا الرقم سلبي.

على الرغم من أن هذا السؤال قديم، اسمحوا لي أن أضع في 2 سنتات.

قبل أن أشرح هذا، دعنا نعود إلى الأساسيات. 2 "تكمل هو مكمل واحد + 1. الآن ما هو مكمل واحد وما هي أهميتها بالإضافة إلى ذلك.

يمنحك مجموع أي رقم N-BIT واستكماله 1 أعلى رقم ممكن يمكن أن يمثله هؤلاء Bits N-. مثال:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

الآن ماذا سيحدث إذا حاولنا إضافة 1 إلى النتيجة. سوف يؤدي إلى تجاوز.

ستكون النتيجة 1 0000 وهو 0 (كما نعمل مع أرقام 4 بت، (1 على اليسار هو تجاوز)

لذا ،

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

ثم قرر شخص ما الاتصال بمكمل 1 + 1 كما لذلك يصبح العبارة أعلاه: أي رقم n'bit + تكمل 2 الخاص به = 0 وهذا يعني استكمال رقم 2 = - (من هذا العدد)

كل هذا ينتج سؤالا واحدا آخر، لماذا يمكننا استخدام فقط (N-1) من BITs N فقط لتمثيل رقم إيجابي ولماذا تمثل الجزء الأيسر الذي يمثله بت تسجيل الدخول (0 على أحدث تعني قليلا + VE، ويعني 1 حتى الرقم). على سبيل المثال، لماذا نستخدم فقط أول 31 بت من int in Java لتمثيل رقم إيجابي إذا كان البت 32 رقم 1، ورقمه.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (النتيجة صفر، مع حالية 1 تفيض)

وبالتالي فإن نظام (n + 2 'من n) = 0، لا يزال يعمل. الغموض الوحيد هنا هو استكمال 2 من 12 هو 0100 والتي تمثل أيضا بشكل غامض +8، بخلاف تمثيل -12 في نظام مكمل ثنائي 2S.

سيتم حل هذه المشكلة إذا كانت الأرقام الإيجابية دائما 0 في تركها معظمها. في هذه الحالة، سيكون لديك مكمول 2 دائما 1 في ترك معظمهم معظمهم، ونحن لن يكون لدينا غموض نفس مجموعة البتات التي تمثل رقم تكمل 2 وكذلك رقم + ve.

متمم ثنائي يسمح بإضافة وإجراء الطرح بالطريقة العادية (مثلك جرح لأرقام غير موقعة). كما يمنع -0 (طريقة منفصلة لتمثيل 0 التي لن تكون مساوية ل 0 مع طريقة BIT العادية لمقارنة الأرقام).

هذا هو تبسيط مبالغ واختلاف الأرقام. مبلغ من العدد السلبي وملء الإيجابي التدوير في أكملاء 2 هو نفس تلخيصها بالطريقة العادية.

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

أخذ قيمة 8 بت7 أ6 أ5 أ4 أ3 أ2 أ1 أ0

التفسير الثنائي غير الموحد المعتاد هو:
277 + 266 + 255 + 244 + 233 + 222 + 211 + 200
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

تفسير تكمل الاثنين هو:
-277 + 266 + 255 + 244 + 233 + 222 + 211 + 200
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

أيا من البتات الأخرى تتغير المعنى على الإطلاق، وتحمل إلى7 هو "الفائض" وليس من المتوقع أن تعمل، إلى حد كبير جميع العمليات الحسابية تعمل دون تعديل (كما لاحظ الآخرون). بلغت حجم الإشارة عموما فحص بتوقية وتستخدم منطق مختلف.

تكملة اثنين يسمح بأرقام سلبية وإيجابية تضاف معا دون أي منطق خاص.

إذا حاولت إضافة 1 و -1 باستخدام طريقة
10000001 (-1)
+00000001 (1)
لقد حصلت
10000010 (-2)

بدلا من ذلك، باستخدام مكملتين، يمكننا إضافة

11111111 (-1)
+00000001 (1) تحصل عليه
00000000 (0)

وينطبق الشيء نفسه بالنسبة للطرح.

أيضا، إذا حاولت طرح 4 من 6 أرقام إيجابي) يمكنك استكمالها 4 وإضافة اثنين معا 6 + (-4) = 6 - 4 = 2

هذا يعني أن الطرح وإضافة كل من الأرقام الإيجابية والسلبية يمكن القيام بها جميع الدائرة نفسها في وحدة المعالجة المركزية.

للتوسع على إجابات الآخرين:

في مكملتين

  • إضافة هي نفس الآلية مثل الأعداد الصحيحة الإيجابية العادي التي تضيف.
  • طرح لا يتغير أيضا
  • الضرب أيضا!

تتطلب الانقسام آلية مختلفة.

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

قراءة الإجابات على هذا السؤال، صادفت هذا التعليق [تحرير].

2 تكملة 0100 (4) ستكون 1100. الآن 1100 هو 12 إذا قلت بشكل طبيعي. لذلك، عندما أقول عادي 1100، فهو 12، ولكن عندما أقول 2 تكمل 1100 ثم هو -4؟ أيضا، في Java عندما يتم تخزين 1100 (يتيح لك افتراض أن 4 بتات الآن) يتم تخزين كيفية تحديده إذا كان +12 أو -4؟ - HAGRAWAL JUL 2 في 16:53

في رأيي، يكون السؤال المطروح في هذا التعليق مثيرا للاهتمام للغاية، ولذا أود أولا أن أعيد صياغته ثم تقديم إجابة ومثال.

سؤال - كيف يمكن للنظام أن ينشئ كيف يجب تفسير أحد أو أكثر من بايتات مجاورة؟ على وجه الخصوص، كيف يمكن للنظام أن يحدد ما إذا كان هناك تسلسل معين من البايتات هو رقم ثنائي عادي أو رقم مكمل في 2؟

الإجابة - ينشئ النظام كيفية تفسير سلسلة من البايتات من خلال أنواع. أنواع تحدد

  • كم عدد بايت يجب مراعاتها
  • كيف يجب تفسير هؤلاء البايتات

مثال - أدناه نفترض ذلك

  • charهي 1 بايت طويلة
  • shortهي 2 بايت طويلة
  • int'رمل floatهي 4 بايت طويلة

يرجى ملاحظة أن هذه الأحجام محددة لنظامي. على الرغم من أنه شائع جدا، إلا أنه يمكن أن يكون مختلفا عن النظام إلى النظام. إذا كنت تشعر بالفضول بما هم عليه في نظامك، فاستخدم مشغل sizeof..

بادئ ذي بدء، نحدد مجموعة تحتوي على 4 بايت وتهيئة كل منهم إلى الرقم الثنائي 10111101, ، المقابلة للرقم السداسي عشري BD.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

ثم نقرأ محتوى الصفيف باستخدام أنواع مختلفة.

unsigned char و signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short و short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, int و float

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

4 بايت في ذاكرة الوصول العشوائي (l_Just4Bytes[ 0..3 ]) تبقى دائما نفس الشيء تماما. الشيء الوحيد الذي يتغير هو كيف نفسرهم.

تكرارا، نحن أخبر النظام كيف لتفسيرها من خلال أنواع.

على سبيل المثال، أعلاه استخدمنا الأنواع التالية لتفسير محتويات l_Just4Bytes مجموعة مصفوفة

  • unsigned char: 1 البايت في عادي ثنائي
  • signed char: 1 البايت في 2 مكمل
  • unsigned short: 2 بايت في تدوين ثنائي عادي
  • short: 2 بايت في 2 تكمل
  • unsigned int: 4 بايت في تدوين ثنائي عادي
  • int: 4 بايت في 2
  • float: 4 بايت في IEEE 754 تدوين واحد الدقة

عدل] تم تحرير هذا المنشور بعد التعليق بواسطة user4581301. شكرا لك على أخذ الوقت لإسقاط تلك الخطوط القليلة المفيدة!

يمكنك مشاهدة البروفيسور جيري كين من ستانفورد يشرح تكمل الاثنين، في المحاضرة الثانية (يبدأ التفسير فيما يتعلق بتكملة 2 في حوالي الساعة 13:00) في سلسلة المحاضرات المسماة نماذج البرمجة المتاحة لمشاهدة من قناة يوتيوب المتوفرة. إليك الرابط إلى سلسلة المحاضرة: http://www.youtube.com/view_play_list؟p=9D558D49CA734A02..

يتم استخدام تكمل اثنين لأنها أبسط لتنفيذ الدوائر وكذلك لا تسمح للصفر السلبي.

إذا كانت هناك بتات X، فسوف تتراوح مكملين من + (2 ^ ^ x / 2 + 1) إلى - (2 ^ ^ x / 2). سيتم تشغيل مكمل واحد من + (2 ^ ^ x / 2) إلى - (2 ^ × / 2)، ولكنه سيسمح إلى صفر سلبي (0000 يساوي 1000 في نظام تكمل 4 بت 1).

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

ولكن لماذا تجد فرق كل رقم من 1؟ حسنا، أنت لست كذلك. نواياك الفعلية هي حساب اختلاف رقم الثنائي المحدد من رقم ثنائي آخر له نفس عدد الأرقام ولكن يحتوي على 1 فقط. على سبيل المثال، إذا كان رقمك 10110001، عندما تقفل كل هذه البتات، فأنت بحساب فعال (11111111 - 10110001).

هذا ما يفسر الخطوة الأولى في حساب مكملا اثنين. الآن دعنا نضم الخطوة الثانية - إضافة 1 - أيضا في الصورة.

أضف 1 إلى المعادلة الثنائية أعلاه:

11111111 - 10110001 + 1

ماذا تحصل؟ هذه:

100000000 - 10110001

هذه هي المعادلة النهائية. ومن خلال إجراء هذه الخطوتين، تحاول العثور على هذا، الفرق النهائي: الرقم الثنائي طرح من رقم ثنائي آخر مع رقم إضافي واحد يحتوي على الأصفار باستثناء موقع بت الأكثر إلغاؤه.

ولكن لماذا نحن هانكرين 'بعد هذا الاختلاف حقا؟ حسنا، من هنا، أعتقد أنه سيكون من الأفضل لو قرأت ويكيبيديا المادة.

نحن نقوم بإضافة عملية إضافة فقط لكل من الجمع والطرح. نضيف المعامل الثاني إلى أول معامل للإضافة. للحصول على الطرح، نضيف مكملا 2 للأشياء الثانية إلى المعامل الأول.

مع التمثيل المتكامل الثاني، لا نحتاج إلى مكونات رقمية منفصلة للطرح فقط، يتم استخدام الإضافات والتكاملين فقط.

من المفيد ملاحظة أنه في بعض الآلات الإضافية المبكرة، قبل أيام أجهزة الكمبيوتر الرقمية، سيتم تنفيذ الطرح من خلال وجود المشغل أدخل القيم باستخدام مجموعة ملونة مختلفة من الأساطير على كل مفتاح (لذلك من شأن كل مفتاح يدخل تسعة ناقص الرقم ليكون طرحه)، واضغط على زر خاص سوف يتحمل حمل إلى حساب. وبالتالي، على آلة ستة أرقام، طرح 1234 من قيمة، سيضرب المشغل مفاتيح من شأنها أن تشير عادة "998،765" واضغط على زر لإضافة هذه القيمة بالإضافة إلى الحساب قيد التقدم. الحساب التكميليان هو ببساطة المكافئ الثنائي لتلك الموجودة في وقت سابق الحساب "المكمل".

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

ميزة رئيسية تمثيل تكملة اثنين والتي لم يتم ذكرها هنا هي أن البتات السفلية من مبلغ استكمال ثنائي أو اختلاف أو منتج يعتمد فقط على البتات المقابلة من المعاملات. السبب في أن القيمة الموقعة 8 بت ل -1 11111111 هو أن طرح أي عدد صحيح له أدنى 8 بت 00000001 من أي عدد صحيح آخر له أدنى 8 بت 0000000 سيؤدي عدد صحيحا إلى أدنى 8 بت 11111111. وبعد الرياضيا، ستكون القيمة -1 سلسلة لا حصر لها من 1، ولكن كل القيم ضمن نطاق عدد صحيح معين ستكون إما كافة 1 أو كل 0 نقطة معينة، لذلك فهي مريحة لأجهزة الكمبيوتر على "تسجيل الدخول" معظم القليل من العدد كما لو كان يمثل عددا لا حصر له من 1 أو 0.

تكملة ثانيا فقط تمثل تمثيل الأرقام الوحيد الذي يعمل بشكل جيد عند التعامل مع أنواع أكبر من حجم الكلمة الطبيعية للآلة الثنائية، نظرا لأنه عند أداء الإضافة أو الطرح، يمكن أن يجلب الرمز رمز أقل من كل معامل، يحسب أدنى قطعة من والنتيجة، وتخزين ذلك، ثم قم بتحميل الجزء التالي من كل معامل، وحسب الجزء التالي من النتيجة، وتخزين ذلك، وما إلى ذلك، حتى، حتى معالج يتطلب جميع الإضافات والطرح للذهاب من خلال سجل واحد 8 بت يمكن التعامل مع الأرقام الموقعة 32 بت بشكل معقول بكفاءة (أبطأ من سجل 32 بت، بالطبع، ولكن لا يزال قابلانا).

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

إجابة مرضية واحدة من سبب استخدام تكامل ثنائي 2 لتمثيل الأرقام السلبية بدلا من نظام تكمل المرء هو أن نظام تكمل ثانيا يحل مشكلة تمثيلات متعددة من 0 والحاجة ل نهاية حولها التي توجد في نظام مكمل واحد من تمثيل الأرقام السلبية.

للمزيد من المعلومات قم بزيارة https://en.wikipedia.org/wiki/signed_number_representations.

لزيارة نهاية حولهاhttps://en.wikipedia.org/wiki/end-around_carry.

لأن مصنعي وحدة المعالجة المركزية كسول!

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