המרות בסיסים

כאשר אנחנו רושמים מספר אנו למעשה עושים שימוש במקדמים ובסיסים. כמו בפולינומים. למשל, הרישום של המספר 102 הוא

1100+010+21

ניתן לראות שזהו פולינום ריבועי כאשר x=10 כלומר

p(x)=ax2+bx+cx0p(10)=a102+b10+c=a100+b10+c

וכעת אנחנו יודעים ש a=1,b=0,c=2 ונקבל את הדרוש. כעובדים עם בסיסים אנחנו תמיד נבין ש x ב״פולינום״ הוא קבוע וערכו הוא כערך הבסיס והמקדמים יכולים להיות טבעיים ושייכים ל [0,b1] כאשר b הוא הבסיס.

במדעי המחשב יש מספר בסיסים שעובדים איתם צמוד כל הזמן:

  1. deciaml- בסיס 10 הנפוץ והידוע.
  2. binary- בסיס 2, הספרות הם 0,1 .
  3. octal- בסיס 8 והספרות הן 07 . הסימון שלו הוא מוביל 0 למשל 0146.
  4. hexadecimal - בסיס 16, הספרות הן 0f. מסומן על ידי 0x . בגלל שבבסיס הזה אנחנו עברנו את 10 כספרה, עלינו להוסיף אותיות שמייצגות את המספרים מ 10 עד 15 כספרות. לכן A-F מייצגות את המספרים הנ״ל כספרות.
הבחנה

כל ההמרות שנראה מיוחסות למספרים unsigned אבל עבור מספרים עם סימן ההמרות דומות

Unsigned - המרה מכל בסיס ל decimal

האלגוריתם המרה הוא מאוד פשוט.
עבור בסיס b ומספר x המיוצג בבסיס הזה. נסמן את אותו כפולינום המיוצג בבסיס b

x=i=0naibi

כאשר n הוא מספר הספרות ו ai{0,1,,b1} . לשם הנוחות נגדיר את קבוצת הספרות כקבוצה סדורה, כלומר הסדר של איברי הקבוצה הוא לפי יחס הסדר בינהם , בהתחלה הכי קטן ובסוף הכי גדול.
נגדיר C:bd פונקציית המרה של ספרות בבסיס b לבסיס d כלומר, decimal באופן הבא

C(x)=(index of x in b)1

כלומר המיקום של x בקבוצה הסדורה, אם ניקח למשל את E בבסיס hexadecimal המיקום שלו בקבוצה hex={0,1,2,,E} יהיה 15 וערכו הוא אכן 151=14.
כמו כן אנחנו יודעים שערכו של b בבסיס עשרוני הוא |{0,1,2,,b1}| . כעת האלגוריתם מעבר לבסיס 10 יעבוד כך

למשל:
א) עבור 1100110 בבסיס בינארי, נקבל

261+251+240+230+221+211+200=102

נשים לב שהחזקה היא המיקום של הספרה כאשר תחילת הספירה היא מ0.

ב) עבור 0x66 נקבל

f16+f06=1616+1606=96+6=102

Unsigned - המרת decimal לבסיס כלשהו

האלגוריתם הבא יוכל להמיר בסיס עשרוני לבסיס כלשהו כאשר המספרים חיוביים.

דוגמה 1:
נייצג את 103 בבסיס 8 .

1038=12|7

כלומר 12 עם שארית 7.

128=1|4

כלומר 1 עם שארית 4

18=0|1

כלומר 0 עם שארית 1 .

ניקח את השאריות בסדר הפוך ונקבל ש 0147 זה המספר.

דוגמה 2:
נחשב את 8 בבסיס בינארי.

שארית שלם
0 8
0 4
0 2
1 1
0

כלומר בייצוג בינארי המספר הוא 1000

מעברי בסיסים נפוצים

Bin -> Hex ו Hex-> Bin

הרעיון בנוי על כך שאנחנו יודעים שלמעשה צריך עד 4 בתים כדי לייצג ספרה בבסיס hex ונוכל להמיר באופן הבא.

מבינארי להקס - נוכל פשוט לחלק את הייצוג הבינארי לרביעיות (מימין לשמאל ואם נשאר עודף לרפד באפסים). כל 4 ספרות כעת נמיר לספרה בבסיס 16.

לדוגמה

00101110

נחלק לספרות 1110,0010 וכל אחד כבר אנחנו יודעים לחשב בנפרד ונקבל 2e .

טיפ להמרה מהירה

תמיד ניעזר במספרים שקל לייצג עם חזקות של 2 למשל אנחנו יודעים עבור המקרה הנ״ל ש 1000=23 בבסיס 10 (חשוב לשים לב שמתייחסים למספר כמו פולינום כלומר האינדקס הראשון מתחיל מ 0) ולכן זה שקול ל 8. כדי להגיע ל 110 הנותרים בדוגמה שלנו אנחנו יודעים שצריך להוסיף עוד 22+21 שזה בעצם 6 כלומר סך הכל מחברים 8+6 בבסיס 10 שזה 14 בבסיס 16 כלומר e

הקס לבינארי - כל תו בהקס נמיר ל 4 ביטים ונחליף את התו בייצוג הבינארי המתאים.

Bin -> Oct ו Oct-> Bin

הרעיון הוא אותו רעיון רק שהפעם נשים לב שצריך לכל היותר 3 ביטים כדי לייצר ספרה בבסיס 8.
נבצע פירוק של המספר ל-"שלישיות" אם אנחנו בבינארי או שנפרק כל ספרה ל3 ביטים כדי לעבור מאוקטלי לבינארי.

כל שאר הייצוגים יידרשו לרוב להשתמש באלגוריתם מעבר לעשרוני או בינארי ואז לבסיס אחר