בסיסי מספרים

February 7, 2019

בסיסי מספרים

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

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

השיטה הבינארית – היא על בסיס 2 - חסכונית בסימנים והיא כוללת רק את הספרות 0 ו- 1   אבל המיקום משתנה מהר יותר. ערך המיקומים מהימיני ביותר לשמאלי ביותר 1, 2 ,4 ,8, 16 ,32 ,64   וכך הלאה - לכן , הערך של המספר הבינארי 111 הוא סיכום של כל המיקומים בהם מופיעה הספרה 1 -  כלומר 10. הערך של המספר הבינארי 10010  הוא 18. המיקום הראשון מימין הוא 2 בחזקת 0, השני 2 בחזקת 1, השלישי 2 בחזקת 2 וכו'.

השיטה האוקטלית - היא על בסיס 8 (והמיקומים על בסיס חזקות של 8). ערך המיקומים הראשונים 1, 8 ,64, 512 ,4096 ,32768 וכו' (המיקום הראשון הוא שמונה בחזקת 0, השני שמונה בחזקת 1 ,השלישי 8 בחזקת 2 וכו')

כך שהמספר האוקטלי 100001 שווה ל- 32,768+1 כלומר 32,769 המספר העשרוני 8 שווה ל- 10  בבסיס אוקטלי.

השיטה ההקסדצימלית (hexadecimal) היא על בסיס 16 – לעיתים יש תועלת בבסיסים הגדולים מ- 10 ובעיקר כאלה שמתכתבים יפה עם איך שהמידע במחשב מאורגן ב- byte. אבל אם בבסיס הבינארי השתמשנו בשתי ספרות, באוקטלי בשמונה ספרות (אפס עד שבע) בעשרוני בעשר ספרות. איך ניקח 16 ספרות שונות אם יש לנו רק 10 ? פשוט, הספרות מ-0 עד 9  כמו בשיעור חשבון ביסודי, לאחר מכן משתמשים באותיות ה- A-B-C האנגלי, a עד f כך שהאות A היא המספר 10  והאות F היא המספר 15.

ערך המיקומים בשיטה: 1, 16, 256, 4096, 65536, וכו'  מה ערכו של המספר ההקסדצימלי ABC ? חחח קודם כל מצחיק שזה מספר (בדרך כלל גם יגיע עם סימון שאנו עוסקים במספר על בסיס 16  ולא במילה כלשהי). נחשב –

A עשר פעמים 256

B אחת עשרה פעמים 16

C שתיים עשרה פעמים 1

סה"כ קיבלנו – 2,748

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

 

print(hex(2748))          >>>   0xabc


print(oct(32769))         >>>   0o100001


print(bin(42))               >>>   0b101010

 

 

הרישום הוא כזה: משמאל לימין רושמים תמיד את הספרה 0 אח"כ אות לועזית המסמלת את הבסיס (x עבור בסיס הקסדצימלי, האות O בסיס אוקטלי והאות b בסיס בינארי) לאחר מכן רושמים את הספרות והאותיות של אותו בסיס. אנו רואים ש- abc הם אכן 2,748 כמו שחישבנו.

ואפשר גם כך (int("124",8 כדי לומר שאנו רוצים את הערך העשרוני של המספר "124" בבסיס אוקטלי, או int("f",16) אם אנו רוצים את הערך של "f" בבסיס הקסדצימלי. לשים לב שגם כאשר יש לנו ספרות, אנו מכניסים אותן כמחרוזת, והמספר השני מימין מייצג את הבסיס).

 

print(int("f",16))                                                >>>  15
print(int("124",8))                                             >>>   84
y = [int(x, 16) for x in 'a1c28e9f7c3d58c10']
print(y)                                                               >>> [10, 1, 12, 2, 8, 14, 9, 15, 7, 12, 3, 13, 5, 8, 12, 1, 0]

 

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

 

תרגיל -מבינארי לעשרוני

טוב, ראינו שפייתון עוברת בקלות מבסיס לבסיס, אבל באנו ליהנות, וגם השקעתי בהסבר על הבסיסים, לכן התרגיל שלי הוא לכתוב פונקציה שתיקח מספר עשרוני שמורכב רק מאפס ואחת (כאילו היה מספר בינארי) ותמצא את הערך העשרוני שלו (בהנחה שהוא היה בינארי באמת – למשל שהמספר 1000 יהפוך ל- 8). תנסו פתרון משלכם, אפשר גם לראות את הפתרון שלי –

 

def bin2dec(bin):
    decimal=0
    power=0
    while bin>0:
        decimal+=2**power*(bin%10)
        bin//=10
        power+=1
    return decimal

print(bin2dec(1001101))             >>>   77


print(bin(77))                                >>>   0b1001101

 

 

הפונקציה בנויה על הרעיון שהחזקה של 2 (בבסיס בינארי) עולה ככל שמתקדמים שמאלה במיקום הבינארי. והטיפול במספר מחולק לשניים – לוקחים את הספרה הימנית ביותר (0 או 1) באמצעות המודולו bin%10 שבעצם משאירה לנו את ספרת היחידות שהיא הימנית ביותר – היא השארית וכל היתר מתחלק יפה בעשר. ספרת היחידות המתקבלת (0 או 1) מוכפלת בהתחלה ב- 2 בחזקת 0 (כלומר ב-1) את המספר המתקבל מוסיפים למשתנה בשם decimal. אחרי שטיפלנו בספרה הימנית ביותר אנו מקצצים את ספרת היחידות מהמספר (bin) ומכינים את משתנה החזקה power לסיבוב הבא והוא הכפלת ספרת היחידות ב- 2 בחזקת 1 (כלומר ב-2). כך ממשיכים את כל הסבבים וצוברים ב-decimal את הערך של כל המכפלות של הספרה הימנית ביותר בחזקות הולכות ועולות של 2.

אם כך יצא לנו שהמספר הבינארי 1001101 הוא בעצם 77, וכדי לבדוק וגם להראות כמה קל לעשות את הדברים בפייתון. אנו בודקים איך פייתון חושבת שהמספר 77 צריך להראות בבסיס בינארי. ואנו מקבלים את אותו דבר בתוספת 0b (אפס ואז האות b המקדימות כל מספר בינארי).

Please reload

Please reload

רעננו את הדף והקליקו למעבר לנושא הבא: