ממיר בסיסי ספירה
ממיר מספר בין בינארי, אוקטלי, עשרוני, הקסדצימלי וכל בסיס מ־2 עד 36, עם משלים ל־2 ברוחב קבוע ורשת ביטים לחיצה.
רוחב 8 ביט, 8 דולקים
מה הכלי הזה עושה
אפשר לכתוב את אותו מספר בבסיסים רבים, ומתכנתים נעים בין ארבעה מהם כל הזמן: בינארי כי זה מה שהחומרה מחזיקה, הקסדצימלי כי זו קיצור קריא לבינארי, עשרוני כי כך אנשים חושבים, ואוקטלי כי הרשאות קבצים וכמה מערכות ותיקות עדיין משתמשות בו. הקלידו ערך באחד השדות כאן והשאר יעקבו, יחד עם שדה נוסף שאפשר לכוון לכל בסיס מ־2 עד 36.
מה שמבדיל אותו ממחשבון בית־ספר הוא בורר הרוחב ורשת הביטים. בחרו 8, 16, 32 או 64 ביט ומספרים שליליים יקבלו את הייצוג האמיתי שלהם במכונה במקום סימן מינוס, וכל ביט הופך למשהו שאפשר ללחוץ עליו.
מה זה בעצם בסיס
בסיס הוא כמה ספרות יש לכם לפני שנגמרות לכם והצריך להעביר נשא. לעשרוני יש עשר, ולכן אחרי 9 בא 10. לבינארי יש שתיים, ולכן אחרי 1 בא 10. המיקום של כל ספרה הוא חזקה של הבסיס, וזה כל הסיפור:
1011 # המספר, בבסיס 2 1 x 8 = 8 # ביט 3 0 x 4 = 0 # ביט 2 1 x 2 = 2 # ביט 1 1 x 1 = 1 # ביט 0 8+0+2+1 = 11 # הסכום, בעשרוני
בסיסים מעל עשר זקוקים ליותר מעשרה סמלי ספרות, ולכן הם שואלים אותיות: הקסדצימלי רץ 0‑9 ואז a‑f, כאשר a הוא 10 ו־f הוא 15. זה נמשך עד בסיס 36, שמשתמש בכל ספרה ובכל אות — הבסיס הגדול ביותר שאפשר לכתוב עם האלפבית הפשוט, וזו הסיבה שהכלי הזה עוצר שם.
למה הקסדצימלי, ולא משהו אחר
הקס פופולרי מסיבה ספציפית אחת: 16 הוא 2 בחזקת 4, ולכן ספרת הקס אחת מכסה בדיוק ארבעה ביטים. זה הופך את ההמרה בין הקס לבינארי לחיפוש בטבלה בלי חשבון — כל ספרת הקס מתרחבת לארבעת הביטים שלה, ללא תלות בספרות שסביבה.
d e a d 1101 1110 1010 1101 # כל ספרת הקס היא ניבל משלה
אוקטלי עובד באותה דרך עם שלושה ביטים לספרה, שכן 8 הוא 2 בחזקת 3 — ולכן הרשאות יוניקס הן אוקטליות: שלושה ביטי הרשאה לכל קבוצת משתמשים נכנסים בדיוק לספרה אחת. לעשרוני אין קשר כזה לבינארי, ולכן המרה ביניהם דורשת חילוק אמיתי ולא חיפוש.
זו גם הסיבה שהשדה הבינארי כאן מקובץ ברביעיות והשדה ההקסדצימלי בזוגות: הקבוצות מתיישרות עם הגבולות שחשובים, כך שאפשר לקרוא ניבל או בייט מהמסך בלי לספור.
מספרים שליליים ומשלים ל־2
למספר שלילי אין צורה בינארית בפני עצמו. אין סימן מינוס באוגר — רק ביטים — ולכן הסימן חייב להיות מקודד בביטים עצמם, וזה דורש להחליט כמה ביטים יש. זו הסיבה שבורר הרוחב קיים, וזו הסיבה שהתשובה משתנה כשמשנים אותו.
השיטה שכל מכונה מודרנית משתמשת בה היא משלים ל־2: כדי לייצג מספר שלילי, לוקחים את הצורה החיובית שלו, הופכים כל ביט, ומוסיפים אחד. התוצאה היא שהביט העליון מסמן «שלילי», וחיבור רגיל ממשיך לעבוד בלי מקרה מיוחד לסימנים.
0000 0101 # 5 1111 1010 # כל ביט הפוך 1111 1011 # ועוד אחד: -5 כבייט, או fb בהקס
הרחיבו את האוגר ואותו מספר יקבל תבנית אחרת: -5 הוא fb ב־8 ביט, fffb ב־16 ו־fffffffb ב־32. הערך לא השתנה; מספר הביטים שנושאים אותו כן. החלפת רוחב בכלי הזה מראה בדיוק את זה.
למה 0xFF הוא גם 255 וגם -1
הביטים ff אינם אומרים אם הם מסומנים. בייט שמחזיק 1111 1111 נקרא כ־255 אם הקוד שטוען אותו הצהיר על טיפוס לא מסומן, וכ־-1 אם הצהיר על מסומן. שום דבר בבייט עצמו אינו מבחין בין השניים — הטיפוס הוא טענה שהתוכנית מעלה על ביטים שאינם נושאים מידע כזה.
זה המקור למשפחה שלמה של באגים אמיתיים: checksum שיוצא שלילי, בייט שנקרא מקובץ ומושווה כקטן מאפס, char ב־C שמתנהג אחרת ב־ARM ובx86 כי הסימון שלו מוגדר על ידי המימוש. בכל פעם שהקריאה המסומנת והלא מסומנת נבדלות, הכלי הזה מציג את שתיהן, כי אי־ההתאמה היא בדרך כלל הדבר שחיפשתם.
רשת הביטים
כל ביט של הערך הנוכחי מוצג עם מספר המיקום שלו, ולחיצה עליו הופכת אותו. הבסיסים מתעדכנים מיד, מה שהופך כמה שאלות לקלות בהרבה מלענות עליהן ביד:
- איזה ביט דלוק בערך הדגלים הזה — לחצו עליהם וקראו את המיקומים.
- מהי המסכה לביטים 4 ו־7 — הדליקו את השניים וקראו את ההקס.
- מה עושה הדלקת הביט העליון לערך מסומן — היא הופכת אותו לשלילי, באופן גלוי.
- האם הערך הזה הוא חזקה של שתיים — לחזקה של שתיים יש בדיוק ביט אחד דלוק.
ביט 0 הוא הביט הפחות משמעותי והוא יושב מימין, וזו מוסכמה אוניברסלית והסיבה שהרשת נשארת משמאל לימין גם בעמוד שנקרא מימין לשמאל. השורות ברוחב שמונה ביטים כדי שגבולות הבייטים יהיו גלויים במבט אחד.
מספרים גדולים נשארים מדויקים
מספרים ב־JavaScript הם doubles, שמחזיקים שלמים במדויק רק עד 2^53 — בערך 9 קוודריליון. ערך של 64 ביט יכול לחרוג מזה, וממיר שבנוי על מספרים רגילים יעגל אותו בשקט, וייתן מחרוזת הקס שנראית סבירה ושגויה בספרות האחרונות שלה.
כאן הכל משתמש במספרים שלמים בדיוק אינסופי במקום, כך שערך מלא של 64 ביט מומר במדויק. מצב הדיוק האינסופי הולך רחוק יותר ומסיר את המגבלה לגמרי — שימושי לערכים קריפטוגרפיים ולמזהים גדולים — אבל שימו לב שבלי רוחב קבוע אין משלים ל־2, ולכן מספר שלילי במצב הזה פשוט נושא סימן מינוס בכל בסיס.
שאלות נפוצות
- למה -5 מוצג כ־fb ולא כ־-101 בבינארי?
- כי לאוגר אין סימן מינוס. כשנבחר רוחב, מספרים שליליים מוצגים במשלים ל־2, שזה מה שהמכונה באמת שומרת: -5 בבייט הוא 1111 1011, כלומר fb. אם אתם רוצים את הצורה המתמטית עם סימן, החליפו את הרוחב לדיוק אינסופי.
- האם 0xFF הוא 255 או -1?
- שניהם — הביטים זהים ורק הטיפוס המוצהר קובע. ערך מסומן של 8 ביט קורא ff כ־-1; לא מסומן קורא אותו כ־255. בכל פעם ששתי הקריאות נבדלות, הכלי מציג אותן זו לצד זו.
- למה משתמשים כל כך הרבה בהקסדצימלי במקום בעשרוני?
- כי ספרת הקס אחת היא בדיוק ארבעה ביטים, ולכן הקס ובינארי מומרים בחיפוש בלי חשבון והספרות מתיישרות עם גבולות בייטים. לעשרוני אין קשר כזה לבינארי, ולכן ערך עשרוני אינו אומר לכם דבר על אילו ביטים דלוקים.
- מהו הבסיס הגבוה ביותר כאן, ולמה 36?
- 36, כי אלה 10 ספרות ועוד 26 אותיות — כל סמל שהאלפבית הלטיני הפשוט מציע. לעלות מעבר לזה היה דורש מוסכמה לגבי אילו תווים נוספים להשתמש, ואין אחת מוסכמת.
- אפשר להדביק ערך עם 0x או עם רווחים?
- כן. הקידומות 0x, 0b ו־0o מתקבלות בבסיס התואם, ורווחים וקווים תחתונים מתעלמים, כך שאפשר להדביק ישירות מקוד או מגיליון נתונים בלי לנקות קודם.
- האם ערך של 64 ביט יומר במדויק?
- כן. כל החשבון משתמש במספרים שלמים בדיוק אינסופי, כך שערכים מעבר ל־2^53 — שם מספר JavaScript רגיל מתחיל לעגל — נשארים מדויקים.
- האם משהו שאני מקליד נשלח לשרת?
- לא. זו אריתמטיקה בדפדפן שלכם; שום דבר אינו מועלה או נרשם, וזה עובד בלי חיבור רשת.