# קצת על בינארי והקס.
לפני שנמשיך קצת על : בינארי והקסדצימלי.
למה בינארי?
לבני אדם יש עשר אצבעות, אז איכשהו יצא שאנחנו סופרים בבסיס 10.
למחשב, לעומת זאת, אין אצבעות. יש לו מיליארדי טרנזיסטורים, שאפשר לחשוב עליהם בצורה מאוד מפושטת כמו מפסקים זעירים שיכולים להיות במצב כזה או במצב אחר.
דלוק או כבוי.
1 או 0.
וזהו.
לכן המידע הדיגיטלי במחשב מיוצג בבסיס 2, שנקרא בינארי (Binary).
אנחנו רגילים לכתוב:
0 1 2 3 4 5 6 7 8 9
כי אנחנו עובדים בבסיס 10.
בבינארי יש רק:
0 1
לכן המספר:
10
בבסיס 2 הוא בעצם 2 בבסיס 10.
וזה מזכיר את המשפט (@בנימין-מחשבים )
"יש 10 סוגי אנשים: אלה שמבינים בינארית ואלה שלא."
אלה שמבינים בינארית יודעים ש־10 זה 2.
ואלה שלא... מחכים ל־9 הבאים. שלא יבואו.
Bit
חשוב לזכור!
Bit הוא יחידת המידע הקטנה ביותר שיש במחשב
ביט אחד יכול להיות:
0
או:
1
כלומר יש לו שתי אפשרויות בלבד.
אם יש ארבעה ביטים:
1010
יש לנו ארבעה ביטים נפרדים:
1 0 1 0
כל אחד מהם יכול להיות 0 או 1.
ואם יש שמונה ביטים:
10101100
יש לנו Byte אחד, כלומר 8 ביטים.
1 0 1 0 1 1 0 0
<------ 8 ------->
זה חשוב כי בהמשך באסמבלי תפגשו כל הזמן במונחים כמו:
Bit
Byte = 8 bits
Word = 16 bits
DWORD = 32 bits
QWORD = 64 bits
אז למה לא בינארי?
כי זה סיוט לבני אנוש...
נניח השורה הבאה.
1101111010101101
זה בינארי אבל לא שקריא לבני אדם.
בקוד מכונה ובזיכרון אנחנו יכולים להיתקל ברצפים הרבה יותר ארוכים.
פה נכנס Hexadecimal, או בקיצור Hex.
הקס - בסיסי 16 בספירה
הקסדצימלי הוא פשוט בסיס 16.
במקום עשר ספרות כמו בבסיס 10:
0 1 2 3 4 5 6 7 8 9
יש לנו 16 אפשרויות:
0 1 2 3 4 5 6 7 8 9 A B C D E F
האותיות מייצגות את המספרים:
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
למה בסיס 16?
עיקרון פשוט ומאוד שימושי:
16 = 2⁴
כל ספרה אחת בהקס מייצגת 4 ביטים.
לדוגמה:
0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = A
1011 = B
1100 = C
1101 = D
1110 = E
1111 = F
במקום לכתוב:
1101111010101101
אפשר לחלק לארבע.
1101 1110 1010 1101
ולהמיר כל קבוצה לספרת Hex:
D E A D
ולכן:
1101111010101101₂ = DEAD₁₆
אותו מידע בדיוק.
צורה יותר קריאה (אני ממש לא מסכים )
איך זה נראה באסמבלי?
באסמבלי, כשתראו מספר Hex, בדרך כלל תראו לפניו 0x.
לדוגמה:
mov rax, 0xDEAD
ה־0x אומר:
"המספר כתוב בהקסדצימלי."
כלומר:
0xDEAD
דרך אחרת לכתוב אותו ערך בבינארי:
1101 1110 1010 1101
או בעשרוני:
57005
שלושת הייצוגים מתארים את אותו ערך:
57005₁₀
= DEAD₁₆
= 1101111010101101₂
לדוגמה:
mov rax, 0xFF
או:
mov rax, 255
מה שונה בהקס?
אבל:
בבסיס 16 אנחנו צריכים 16 ספרות, אבל יש לנו רק:
0-9
פשוט ממשיכים באותיות:
A = 10
B = 11
C = 12
D = 13
E = 14
F = 15
ולכן אפשר לראות דברים כמו:
0xDEAD
0xBEEF
0xCAFE
אחד המפורסמים הוא:
0xDEADBEEF
לסיכום:
בזיכרון של המחשב אין באמת "Hex".
Hex הוא דרך שבה אנחנו כותבים ומציגים מידע.
גם "בינארי" הוא דרך הייצוג שלנו למידע הדיגיטלי.
בפועל, בזיכרון יש מצבים פיזיקליים שאנחנו מייצגים כ־0 ו־1.
לכן אם בזיכרון יש למשל:
10101100
אפשר להציג את אותם 8 ביטים כ:
10101100 ← בינארי
AC ← Hex
172 ← עשרוני
זה לא אומר שיש בזיכרון שלושה דברים שונים.
יש אותו מידע, ואנחנו מסתכלים עליו בשלוש דרכים
זה מתחבר למה שאמרתי קודם.
הביטים עצמם לא אומרים לנו מה הם "אמורים להיות".
אותו רצף ביטים יכול להיות מספר, חלק מטקסט, נתונים, או הוראות מכונה הכול באופן שבו מפרשים אותו. (וזה עוד עניין וצ"ע)
אז למה Hex?
כי כשעובדים בלואו לבל נתעסק המון בבינארי
אבל לכתוב בינארי זה סיוט:
11111111100000001111010110101010
ב־Hex זה הופך ל:
0xFFF0F5AA
הרבה יותר קצר, הרבה יותר קל לראות ולזהות מבנים. (עובדים עם זה המון..)
בגלל שכל ספרת Hex מייצגת בדיוק 4 ביטים, אפשר לעבור מבינארי לHex בצורה מאוד קלה.
לדוגמה:
1011 0010 1111 0100
הופך ל:
B 2 F 4
כלומר:
0xB2F4
בעז"ה זה היה קצת חשבון @אלישי אשמח להצטרף לקבוצת תכנות זה יהיה יותר מסודר..
בעז"ה המשך יבוא (גילוי נאות: AI ערך לי את הפוסט אך לא כתבו)