משלים ל-2

שיטת המשלים ל־2 היא שיטה לייצוג מספרים עם סימן בבסיס בינארי. בשיטה זאת הסיבית הגבוהה ביותר (MSB - Most Significant Bit) מייצגת את הסימן של המספר (חיובי או שלילי) ושאר הספרות מייצגות את ערך המספר (בצורה שונה מייצוג רגיל אם הוא שלילי). שיטה זו מקובלת בתחום המחשבים כשיטה שימושית לייצוג בינארי של מספרים שעשויים להיות שליליים או חיוביים.

היתרון המשמעותי של שיטה זו, והסיבה שהיא שכיחה בעולם המחשבים היא שייצוג בשיטה זו מאפשר להשתמש אך ורק ביחידת חיבור אחת לכל סוגי המספרים הבינארים, ומכאן שיטה זו מבטלת את הצורך בעוד יחידות חישוב במיוחד למספרים שלילים, מה שחוסך מקום פיזי במעגלים חשמליים.

== ייצוג ==
בשיטה משתמשים בייצוג הרגיל (ללא סימן) של מספרים בתחום מסוים, למשל מספרים בני 4 ביטים, "חותכים" את החלק העליון של התחום, ומדביקים אותו אל החלק התחתון, באותו סדר. כלומר, אם בייצוג בינארי רגיל המספרים הגבוהים ביותר הם 8–15, בשיטת המשלים ל-2 הייצוג שמשמש את המספרים האלה ישמש עבור המספרים שבין מינוס 8 לבין מינוס 1, באותו סדר. הקידוד עבור 8 (1000) ישמש עבור קידוד מינוס שמונה (16-8=8), הקידוד עבור 9 (1001) ישמש עבור מינוס 7 (16-9=7), וכן הלאה עד הקידוד עבור 15 (1111) שישמש עבור מינוס 1 (16-15=1). כלומר הקידוד עבור 2 בחזקת מספר הביטים פחות X, הוא הקידוד עבור מינוס X.

על מנת לייצג מספר בן n סיביות בשיטת המשלים ל-2 יש להפריד את הסיבית השמאלית ביותר משאר המספר.

כאשר ישנן n סיביות, ניתן לייצג כל x בטווח <math>-2^{n-1} \le x \le 2^{n-1}-1</math>.

מספרים חיוביים מיוצגים על ידי n-1 הספרות הימניות של המספר בייצוג בינארי רגיל, הסיבית השמאלית ביותר היא 0 ומשמעותה שהמספר חיובי. ניתן לייצג רק מחצית מכמות המספרים החיוביים האפשריים בייצוג ללא סימן.
בהתאם, במספרים שליליים הסיבית השמאלית ביותר היא 1 ומציינת שהמספר הוא שלילי.
{| class="wikitable" border="1"
! מספר בינארי
! ייצוג עשרוני כאשר המספר הוא ללא סימן
! ייצוג עשרוני בשיטת המשלים ל-2
|-
|0111
|7
|7
|- bgcolor="#EFEFEF"
|0110
|6
|6
|-
| 0101
| 5
| 5
|- bgcolor="#EFEFEF"
| 0100
| 4
| 4
|-
| 0011
| 3
| 3
|- bgcolor="#EFEFEF"
| 0010
| 2
| 2
|-
| 0001
| 1
| 1
|- bgcolor="#EFEFEF"
| 0000
| 0
| 0
|-
|1111
|15
|1-
|- bgcolor="#EFEFEF"
|1110
|14
|2-
|-
|1101
|13
|3-
|- bgcolor="#EFEFEF"
| 1100
| 12
| 4-
|-
| 1011
| 11
| 5-
|- bgcolor="#EFEFEF"
| 1010
| 10
| 6-
|-
| 1001
| 9
| 7-
|- bgcolor="#EFEFEF"
|1000
|8
|8-
|-
|}

== חישובים ==
על מנת להמיר מספר שלילי למספר המיוצג בשיטת המשלים ל־2 יש לחשב את ערכו המוחלט של המספר, לזה יש מספר שיטות:

שיטה מספר 1:

להפוך את כל הסיביות (1 ל-0 ו-0 ל-1) ולהוסיף 1.

נמיר לדוגמה את המספר 17-:

צעד ראשון: נמיר את ערכו המוחלט של 17- למספר בייצוג בינארי (17 = 0001 0001)
צעד שני: נהפוך את כל הסיביות (1110 1110)
צעד שלישי: נוסיף 1 (1111 1110 = 17-)

שיטה מספר 2:

להביט במספר בינארי מסוים מהסיבית הנמוכה (הימנית ביותר) לסיבית הגבוהה (השמאלית ביותר), במידה ויש 1, להפוך את שאר המספרים אחריו (0 הופך ל1 ו 1 הופך ל 0).

נמיר לדוגמה את המספר 17-:

צעד ראשון: נמיר את ערכו המוחלט של 17- למספר בייצוג בינארי (17 = 0001 0001)
צעד שני: נזהה היכן ה-1 הראשון (0001 0001)
צעד שלישי: נהפוך את כל הסיביות הבאות אחריו (1111 1110 = 17-)

שיטות אלו זהות מתמטית והן סימטריות, כלומר ניתן להמיר איתן מספר חיובי לשלילי, ומספר שלילי לחיובי (בלי לשנות את סדר הצעדים).

=== חיבור ===

חיבור בשיטה זו מתבצע באותו אופן כמו חיבור בינארי רגיל.

לדוגמה: 2 = (3-) + 5

{| class="wikitable" border="1"
|-
| 0000&lrm; 0101
| =
| 5+
|-
| 1111&lrm; 1101 +
| =
| 3-
|-
| 0010 0000 (1)
| =
| 2+
|}
ניתן לראות כי מאחר שמשתמשים בגודל מסוים של זיכרון (במקרה שלנו 8 ביט) הסיפרה 1 השמאלית יוצאת ממרחב הזיכרון המסוים כך יוצא שאיפסנו את הספרות השמאליות והמספר שנוצר הוא חיובי.

=== חיסור ===
על מנת לבצע חיסור, נבצע חיבור של המספר המחוסר עם הנגדי של המספר המחסר כאשר שניהם מיוצגים בשיטת המשלים ל-2 (חיבור מספר שלילי זהה לחיסור מספר חיובי)

לדוגמה: (5-) = 12 - 7

ראשית נמיר את 12- בשיטת המשלים ל-2 (0100 1111) ולאחר מכן נבצע:

{| class="wikitable" border="1"
|-
| 0000&lrm; 0111
| =
| 7+
|-
| 1111&lrm; 0100 +
| =
| 12-
|-
| 1111&lrm; 1011
| =
| 5-
|}

=== פיתוח השיטה ===
משמעות ההשלמה ל-2 היא שכל הספרות הרגילות עד לספרה השמאלית ביותר מוכפלות ב-2 בחזקת מיקומן, מלבד לספרה השמאלית ביותר שמוכפלת במינוס 2 בחזקת מיקומה, למשל בייצוג השלמה ל-2:
<div style="text-align: center;">
:<math>\ 101001 = 2^{0}+ 2^{3}-2^{5}= -23</math>
</div>
והרי כזכור 23 בבסיס בינארי הוא 010111:
<div style="text-align: center;">
:<math>\ 010111 = 2^{0} + 2^{1} + 2^{2} + 2^{4} + (-2^{5}*0) = 23</math>
</div>
אכן ניתן לראות שאם נהפוך את כל הספרות, ונוסיף אחד, נקבל את המוצג לעיל.
כעת, דרך אחת להסתכל על הסיבה לכך שהיפוך הספרות (השלמה ל-1 או יותר נכון Ones' Complement) ולאחר מכן הוספת 1 מייצר את ההשלמה ל-2 של המספר שאיתו מתחילים, נובעת מהביטוי הבא:
<div style="text-align: center;">
:<math>\ 2^{n} = 2^{n-1} + 2^{n-2} + ... + 2^{1} + 2^{0} + 1</math>
</div>
במקרה שלקחנו למעלה, עבור 23, n=5. כעת ניתן לייצג את 23 בשתי דרכים:
<div style="text-align: center;">
:<math>\ 2^{5} - 2^{3} - 1 = 2^{0} + 2^{1} + 2^{2} + 2^{4} </math>
</div>
שימו לב שיש כאן ייצוג בשתי דרכים שונות ל-23 וכמו כן, אם נשים מינוס לפני כל אחד מהאגפים נקבל 23-.
כעת, בעצם ניתן להבין שכאשר הופכים את כל האפסים לאחדים וההפך, בעצם כעת משתמשים בחזקות של שתים שקודם התאפסו וההפך, כלומר עבור 23 מתחילים מ-
<div style="text-align: center;">
:<math>\ 010111 = 2^{0} + 2^{1} + 2^{2} + 2^{4} + (-2^{5}*0) = 23</math>
</div>
ועכשיו אם נהפוך את כל הספרות:
<div style="text-align: center;">
:<math>\ 101000 = 2^{3} + (-2^{5}*1)</math>
</div>
וראינו לפי הפיתוח שחסר אחד כדי שנקבל 23-. לכן מוסיפים אחד!
<div style="text-align: center;">
:<math>\ 101001 = 1 + 2^{3} + (-2^{5}*1) = -23</math>
</div>

==ראו גם==
* משלים ל-1

קטגוריה:קידוד נתונים