עשרוני בקידוד בינארי

עשרוני בקידוד בינארי (הידוע יותר בראשי התיבות BCD - Binary Coded Decimal), היא דרך הקידוד הנפוצה ביותר של ספרות עשרוניות במחשבים ובמערכות אלקטרוניות. ב-BCD, כל ספרה עשרונית מיוצגת על ידי 4 סיביות, כאשר ערכן של הסיביות מימין לשמאל הוא 1,2,4 ולבסוף 8. זהו מספר הסיביות המינימלי שיכול לייצג באופן בינארי את כל הספרות מ־0 עד 9. קיימים צירופי סיביות אחרים אשר משמשים לייצוג של סימן המספר או מאפיינים אחרים של הספרה/מספר. כדי לקודד מספר עשרוני כדוגמת 127 בעזרת BCD, יש לקודד כל ספרה בנפרד לייצוג הבינארי שלה, ולכן למספר הנ"ל נקבל את הקידוד: 0111, 0010, 0001. כיוון שיחידת האחסון של מרבית המחשבים, הבייט, הוא ברוחב 8 סיביות, ישנן שתי דרכים נפוצות לאחסן ספרות BCD (אשר רוחבן 4 סיביות כ"א) בבייטים אלה: האחת - להתעלם מ־4 הסיביות הנוספות שבבייט, לרוב על ידי הצבת 0 או 1 לתוכם; השנייה - לאחסן שתי ספרות BCD בכל בייט. מספר כזה נקרא מספר BCD דחוס או מצופף, כאשר לרוב מספרי BCD דחוסים מלווים ב"ספרה" נוספת אשר מייצגת את הסימן של המספר כולו (נהוג לבחור את 1100 כספרת הסימן "+" ואת 1101 כספרת הסימן "-"). לכן, ניתן לייצג את המספר 127 באחת משתי הצורות הבאות: (11110111, 11110010, 11110001) בשיטה הראשונה (שיטת EBCDIC) או (01111100, 00010010) בשיטת BCD דחוס. אף על פי ש־BCD בזבזני במקום (כמעט שישית מהזיכרון מתבזבז, אפילו כאשר משתמשים בBCD דחוס), יש לו התאמה נוחה לשימוש למערך התווים של ASCII - ניתן לקבל את ערך ה־ASCII של הספרה על ידי פעולת OR בין ספרת ה־BCD עם המספר הבינארי 00110000 (המייצג את המספר העשרוני 48), או במילים אחרות - קוד ה־ASCII של ספרה הוא שרשור 4 הסיביות של ספרת ה־BCD עם המספר הבינארי 0011 משמאל. באופן דומה, ניתן לקבל את הספרות בייצוג EBCDIC על ידי שרשור 4 הסיביות של הספרה עם המספר הבינארי 1111 (או הפעלת OR עם המספר 11110000). נוסף על כך, ניתן להציג מספרים גדולים בקלות על רכיבי תצוגה עם 7 מקטעים, על ידי פיצול המספרים לחצאי-בתים (כלומר לקבוצות של 4 סיביות) ושליחת כל קבוצה לרכיב בתצוגה שונה. למעשה, רכיב ה־BIOS במחשב האישי נוהג לרוב לשמור את התאריך והשעה בפורמט BCD, כנראה מסיבות היסטוריות (כמו שנאמר לעיל, ניתן לעבור מ־BCD לייצוג ASCII בקלות יחסית). גם כיום קידוד BCD נמצא בשימוש רחב, ואריתמטיקה עשרונית מתבצעת בעזרת קידוד BCD או קידודים דומים. BCD נפוץ מאוד במערכות אלקטרוניות שבהם יש צורך להציג ערך מספרי, במיוחד במערכות אשר מכילות רכיבים לוגיים דיגיטליים בלבד (ללא מיקרו-מעבד). על ידי ניצול עקרונות BCD, ניתן לפשט במידה ניכרת את הטיפול במידע מספרי לתצוגה, וזאת על ידי התייחסות לכל ספרה כתת-מעגל יחיד. דבר זה תואם למדי את המציאות הפיזית של חומרת תצוגה - מתכנן המערכת יכול לבחור בסדרה של מספר רכיבים זהים אך נפרדים של תצוגה עם 7 מקטעים לצורך הצגת מספר של מכשיר מדידה כלשהו. אם הגודל הנמדד נשמר ומטופל כבינארי טהור, הרי שתרגום מידע זה לתצוגה יצרוך חומרה מסובכת ויקרה. אם הגודל הנמדד מטופל דרך BCD, ניתן לממש את אותה המערכת בקלות רבה (כפי שתואר בפסקאות הקודמות), ובצורה מודולרית (ניתן להרחיב את התצוגה ללא צורך בהתערבות הלוגיקה הקיימת לרכיבי התצוגה הקודמים). אם ספרה עשרונית דורשת 4 סיביות, הרי ששלוש ספרות עשרוניות דורשות 12 סיביות. אולם, כיוון ש210>103, אם שלוש הספרות מקודדות ביחד, הרי שידרשו 10 סיביות בלבד. שני קידודים כאלה הם: קידוד צ'ן-הו ועשרוני דחוס בצפיפות. IBM השתמשה במושגים עשרוני בקידוד בינארי ו־BCD עבור קודים אלפאנומריים ברוחב 6 סיביות אשר ייצגו מספרים, אותיות לטיניות גדולות, ותווים מיוחדים. וריאציות שונות על ה-BCD שימשו במרבית המחשבים המוקדמים של IBM, כולל IBM 1620, סדרת IBM 1400 והמחשבים הלא-עשרוניים בסדרת IBM 700/7000. חברת IBM החליפה את ה-BCD שלה לקוד EBCDIC ברוחב 8-סיביות, עם יציאת המחשב IBM System/360. מקומות הסיביות ב־BCD היו מיוצגים בדרך כלל על ידי B, A, 8, 4, 2 ו-1. כדי לקודד ספרות, B ו-A היו מאופסים. לדוגמה, בקוד BCD זה האות A קודדה כך - (B,A,1). כאמור לעיל, השיטה להצגת מספרים עשרוניים בעזרת קידוד בינארי המופיע בערך זה היא הקידוד הנפוץ ביותר, אך ישנן רבות אחרות. לכן, למען הבהירות השיטה המוצגת כאן נקראת גם SBCD (באנגלית: עשרוני בקידוד בינארי פשוט), או BCD 8421. המילה 8421 מציינת את משקל כל סיבית בייצוג. הטבלה הבאה מייצגת את הספרות העשרוניות במספר שיטות BCD כפי שהוזכר מקודם, מספרים ב-BCD ניתנים להצגה פשוטה ולהמרה בקלות למחרוזת. אפשר לייצג מספר באורך ספרות לא מוגבל, תאורטית. בשיטת BCD ניתן גם להכפיל ולחלק ב-10 וחזקותיו בקלות יחסית, על ידי פעולת היסט (shift) של ספרה אחת. למשל 161 = 10 / 1610. בשיטת BCD קיים קידוד מדויק לכל מספר בעל ייצוג עשרוני. למשל, המספר 0.1 לא ניתן לקידוד מדויק בשיטות בינאריות כגון נקודה צפה ונקודה קבועה, אך ניתן לקודד אותו מדויק ב-BCD באמצעות ספרה אחת אחרי הנקודה. לעומת זאת, מספרים שלא ניתן לייצג עשרונית לא ניתן לייצג גם ב-BCD, למשל ...0.666 = 2/3. שיטת BCD חוסכת בזמן ביצוע של קלט ופלט. התרגום מבינארי לעשרוני הוא פשוט יותר, מיידי יותר. בשנת 1972, בית המשפט העליון של ארצות הברית ביטל החלטה של ערכאה נמוכה שאישרה פטנט להפיכת מספרים מקודדים ב־BCD לבינארי על מחשב. היה זה תקדים חשוב בניסיון לקבוע האם ניתן לרשום פטנטים על תוכנה ואלגוריתמים. קוד גריי קוד שתיים-מתוך-חמש מדיה וקבצים בנושא עשרוני בקידוד בינארי בוויקישיתוף IBM: קידוד צ'ן-הו IBM: עשרוני דחוס בצפיפות גוטצ'לק נגד בנסון