Lesson 1

הערה: המסמך הזה נכתב ביישור לימין. כדי לקרוא אותו נכון לחצו

Edit

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

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

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

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

ודאו שהבנתם את הדוגמה. אם אינכם בטוחים, נסו להסביר אותה למישהו אחר.

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

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

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

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

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

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

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

למשל: 52031

5*10^4 + 2*10^3 + 0*10^2 + 3*10^1 + 1*10^0 = 50000+2000+0+30+1 (לא אבצע את השלב האחרון בחישוב כי אין לנו שום דרך מוכרת אחרת לייצג מספרים בינתיים).

הבחירה ב10 כבסיס היא שרירותית: הבבלים, למשל, ספרו בבסיס 60. היו להם 60 ציורים שונים שכל אחד מהם ייצג ספרה אחרת. הייתי יכול ליצג את אותו 52031 בשיטה שלהם כך:

(14)(27)(11) (ה14 הכי שמאלי)

ואכן:

14*60^2 + 27*60^1 + 11*60^0 = 50400 + 1620 + 11 = 52031

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

הבסיס הכי קטן שאפשר לספור בו בשיטה ספרתית הוא 2, שנקרה גם בסיס בינרי (מילה שמיתרגמת לאנגלית כdual ולא קיימת בעברית).

איך סופרים בבסיס בינרי
0 בבינרית זה 0. 1 בבינרית זה 1.

הדרך הכי פשוטה למצוא ייצוג של מספר עוקב למספר בבינרית היא חיבור אנכי:

1 1 1 + - 10

(כדי לראות את זה נכון, ישרו לימין).

10 1 + -- 11

11 11 1 + -- 100

מכאן מגיעים לכלל: הופכים את הספרה הכי ימנית. אם היא הופכת ל0, הופכים את הספרה שאחריה וכו' וכו'. (אגב, זה בדיוק אותו הכלל כמו בהוספת 1 למספר עשרוני. נסו להוסיף אחד ל2599).

המרה מבינרי
המרה מבינרי עובדת בדיוק כמו המרה מכל בסיס אחר. אתן דוגמה:

1101001 = 1*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 64+32+8+1 = 105

תרגיל: המר את המספרים 110, 1001, 100000, 1111111, 100101110 לבסיס עשרוני. אל תעבור הלאה לפני שפתרת את התרגיל!

כמובן שנוח יותר שפוט לזכור סדרה של משקלים שבהם מכפילים: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, ... אל תשננו אותם, אבל עם הזמן תגלו שאתם זוכרים אותם מתוך הרגל. אני זוכר את כולם עד 4096 בלי לחשוב לרגע ומסוגל להיזכר עם קצת מחשבה בעוד כמה :P.

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

6256 0 3123 1 1561 1 780 0 390 0 195 1 97 1  48 0  24 0  12 0   6 0   3 1   1 1   0

6256(10) = 1100001100110(2)

תרגיל: המירו 5, 14, 727, 255, 256 לבינרית.

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

678

- 1 678-512=166 --1-1 166-128=28 ---1--1-1 28-16=2 -1-1--1-1 2-2=0 101001010

תרגיל: החזקות הראשונות של שתיים: 0 1 1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256

המר את 89, 43, 15 לבינרית.

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

לכן המספר הכי גדול שמחשב כזה מסוגל לייצג הוא 11111111111111111111111111111111.

תרגיל: המר מספר זה לעשורני.

המספר הכי קטן שהוא מסוגל לייצג הוא כמובן 00000000000000000000000000000000, שהוא 0.

אבל את הדיון הזה יהיה לי יותר נוח לנהל לגבי מחשבי 8 סיביות.

אז נניח שמספר מכיל 8 תאים המייצגים כל אחד ספרה בינרית. אפשר לייצג כך 256 מספרים שונים, בין 0 ל-255.

אבל אם נרצה לחשב דברים לגבי מספרים שליליים?

קיימת שיטת ספירה, שנקראת משלים ל-2, שאיתה נוח לעבוד ושמסוגלת עם 8 ספרות להציג את כל המספרים בין -128 ל127.

משלים ל2
קראו http://he.wikipedia.org/wiki/%D7%9E%D7%A9%D7%9C%D7%99%D7%9D_%D7%9C-2.

תרגילים:

המירו -35 לבינרי בשיטת המשלים ל2. המירו 11011011 לעשרוני בשיטת המשלים ל2. המירו 01011011 באותה שיטה.

חשבו בבינרית 5 ועוד -6.

בעצם הגדרנו כך גם חיסור בינרי:

"כדי לחסר שני מספרים בינריים, חבר את הראשון למשלים ל2 של השני".

http://en.wikipedia.org/wiki/Two%27s_complement

קראו עד כפל.

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

נלמד על "או", על "וגם", על "לא" ועל "או-לא-מכליל" הנקרא גם "או אקסקלוסיבי".

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

לא
כדי לקבל "לא" של ספרה, הופכים אותה. אם הייתה 0, תהיה 1 ולהיפך.

NOT(10001110) = 01110001

או
"או" של שתי ספרות הוא 0 אם ורק אם שתיהן 0.

11101001 OR 01100011

11101011

וגם
"וגם" הוא 1 אם ורק אם שתי הספרות הן 1.

11101001 AND 01100011

01100001

או לא מכליל
"או לא מכליל" של שתי ספרות הוא 1 אם הן שונות זו מזו.

11101001 XOR 01100011

10001010

שימושיות של פעולות לוגיות
פעולות אלה יהיו מאד שימושיות בעת תכנות, אבל זו לא הסיבה שלימדתי אותן עכשיו.

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

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

קראו:

http://en.wikipedia.org/wiki/Category:Logic_gates

(לפחות על שערים לוגיים באופן כללי ועל NOT, AND, OR, XOR).

http://en.wikipedia.org/wiki/Flip-flop_%28electronics%29

http://en.wikipedia.org/wiki/Adder_%28electronics%29

http://en.wikipedia.org/wiki/Multiplexer

http://en.wikipedia.org/wiki/Shift_register

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

תרגיל מסכם:

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

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

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

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

כתבו והדגימו שתי דרכים להרחיב אותו (את מספר קווי הכתובת או הערך בו):
 * יצירת רכיב גדול יותר משניים באותו גודל (שרטטו מעגל עם שני הרכיבים כקופסאות שחורות).
 * יצירת מעגל גדול יותר בשינוי קל (שרטטו מעגל עם החלקים הברורים כ"..." או משהו דומה)

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

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

על המעגל לנצל את אותם מפסקים לכמה פעולות דומות כדי לחסוך במפסקים.

כתבו הנחיות לשימוש במעגל.

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

אין להיעזר האחד בשני במציאת פתרון. ברגע שמצאתם פתרון מותר לדון בו עם חבריכם (רק כשהוא מוכן ונשלח אליי!).

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