C2_bits_and_bytes

Download Report

Transcript C2_bits_and_bytes

‫‪Bits and Bytes‬‬
‫סיביות ובתים‬
‫נושאים‬
‫‪‬‬
‫מדוע ביטים ?‬
‫ייצוג מידע בינארי ‪ /‬הקסדצימלי‬
‫‪ ‬ייצוג של בתים‬
‫‪‬‬
‫פעולות ברמת הביטים‬
‫‪ ‬לוגיקה בוליאנית‬
‫‪ ‬כיצד הדבר נראה בתוכניות ‪? C‬‬
‫‪‬‬
‫» מספרים‬
‫» תווים ומחרוזות‬
‫» פקודות )‪(instructions‬‬
‫–‪–1‬‬
‫מדוע מחשבים לא עובדים בבסיס ‪? 10‬‬
‫המחשב האלקטרוני הראשון ‪ ENIAC‬השתמש ב ‪ 10‬שפורפרות ואקום לכל‬
‫ספרה‪.‬‬
‫קושי טכני‪...‬‬
‫‪ .1‬קשה לאגור מידע‬
‫‪ .2‬קשה להעביר מידע‬
‫‪‬‬
‫דרוש דיוק גבוה כדי לקודד ‪ 10‬רמות שונות של אינפורמציה על מוליך‬
‫אחד‪.‬‬
‫‪ .3‬מסובך לבצע חישובים לוגיים‬
‫‪‬‬
‫חיבור‪ ,‬כפל‪...‬‬
‫–‪–2‬‬
‫ייצוג בינארי‬
‫מימוש בחומרה‬
‫‪‬‬
‫‪‬‬
‫קל לאגור עם אלמנטים ‪bi-stable‬‬
‫העברה אמינה גם כשהמוליכים לא אמינים ומדויקים‬
‫‪0‬‬
‫‪1‬‬
‫‪0‬‬
‫‪3.3V‬‬
‫‪2.8V‬‬
‫‪0.5V‬‬
‫‪0.0V‬‬
‫–‪–3‬‬
‫סיביות‬
‫–‪–4‬‬
‫ייצוג בינארי‬
‫ייצוג בינארי (בסיס ‪)2‬‬
‫‪‬‬
‫נייצג את ‪ 1521310‬עם‬
‫‪111011011011012‬‬
‫בהמשך נלמד איך מייצגים שברים‪:‬‬
‫‪‬‬
‫נייצג את ‪ 1.5213 X 104‬עם‬
‫‪‬‬
‫נייצג את ‪ 1.2010‬עם‬
‫‪1.11011011011012 X 213‬‬
‫‪ 13‬סיביות‬
‫‪1.0011001100110011[0011]…2‬‬
‫–‪–5‬‬
‫ייצוג מספרים בבסיסים שונים‬
‫ייצוג ‪:hexadecimal‬‬
‫‪0‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪8‬‬
‫‪9‬‬
‫‪A‬‬
‫‪B‬‬
‫‪C‬‬
‫‪D‬‬
‫‪E‬‬
‫‪F‬‬
‫‪0000‬‬
‫‪0001‬‬
‫‪0010‬‬
‫‪0011‬‬
‫‪0100‬‬
‫‪0101‬‬
‫‪0110‬‬
‫‪0111‬‬
‫‪1000‬‬
‫‪1001‬‬
‫‪1010‬‬
‫‪1011‬‬
‫‪1100‬‬
‫‪1101‬‬
‫‪1110‬‬
‫‪1111‬‬
‫‪0‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪8‬‬
‫‪9‬‬
‫‪10‬‬
‫‪11‬‬
‫‪12‬‬
‫‪13‬‬
‫‪14‬‬
‫‪15‬‬
‫‪ ‬בסיס ‪16‬‬
‫‪ ‬ספרות ‪ 9 -0‬ואותיות ’‪‘A’ – ‘F‬‬
‫ב – ‪ C‬כתוב ‪ FA1D37B16‬כך‪:‬‬
‫‪ 0xFA1D37B‬או‬
‫‪0xfa1d37b‬‬
‫–‪–6‬‬
‫ טווח של ערכי בתים‬:‫דוגמה‬
‫ סיביות‬8 = ‫בית‬
–7–

Binary
000000002
to 111111112

Decimal:
010
to
25510

Hexadecimal
0016
to
FF16
‫מלים )‪(machine words‬‬
‫לכל מחשב יש 'רוחב מילה'‬
‫‪‬‬
‫הגודל המוקצה למידע מסוג ‪( integer‬כולל כתובות)‪.‬‬
‫רב המחשבים היום עובדים עם רוחב של ‪ 32‬סיביות (‪ 4‬בתים)‬
‫‪‬‬
‫מגביל את מרחב הכתובות ל – ‪4GB‬‬
‫‪‬‬
‫מתחיל להיות צפוף‪...‬‬
‫מחשבים מתקדמים יותר עובדים עם ‪ 64‬סיביות (‪ 8‬בתים)‬
‫‪‬‬
‫מרחב הכתובות ‪  1.8 X 1019‬בתים‬
‫–‪–8‬‬
‫ארגון הזיכרון לפי בתים‬
‫תוכניות מתייחסות לכתובות 'מדומות' (וירטואליות)‬
‫‪‬‬
‫באופן אבסטרקטי‪ :‬מערך גדול של בתים‬
‫‪ ‬בפועל ממומש עם היררכיה שלמה של סוגי זיכרונות‬
‫‪ ‬מהדר )‪ + (compiler‬רכיבי חומרה קובעים את המיפוי לזיכרון‬
‫הפיזי‪.‬‬
‫‪‬‬
‫נראה את ייצוג הכתובות במערך זה‪.‬‬
‫–‪–9‬‬
‫ארגון הזיכרון לפי מלים‬
‫‪Addr.‬‬
‫‪0000‬‬
‫‪0001‬‬
‫‪0002‬‬
‫‪0003‬‬
‫‪0004‬‬
‫‪0005‬‬
‫‪0006‬‬
‫‪0007‬‬
‫‪0008‬‬
‫‪0009‬‬
‫‪0010‬‬
‫‪0011‬‬
‫‪0012‬‬
‫‪0013‬‬
‫‪0014‬‬
‫‪0015‬‬
‫‪Bytes‬‬
‫‪64-bit‬‬
‫‪Words‬‬
‫‪Addr‬‬
‫=‬
‫‪0000‬‬
‫??‬
‫‪Addr‬‬
‫=‬
‫‪0008‬‬
‫??‬
‫‪32-bit‬‬
‫‪Words‬‬
‫‪Addr‬‬
‫=‬
‫‪0000‬‬
‫??‬
‫‪Addr‬‬
‫=‬
‫‪0004‬‬
‫??‬
‫הכתובות הן של בתים‬
‫‪‬‬
‫הבית הראשון במילה‬
‫‪‬‬
‫כתובות של מלים עוקבות רחוקות‬
‫זו מזו ב ‪ 4‬או ‪ ,8‬לפי רוחב המילה‪.‬‬
‫‪Addr‬‬
‫=‬
‫‪0008‬‬
‫??‬
‫‪Addr‬‬
‫=‬
‫‪0012‬‬
‫??‬
‫– ‪– 10‬‬
‫ייצוג מידע‬
:C ‫גודל בבתים של אובייקטים שונים של‬

C Data Type Compaq Alpha
 int
4
 long int
8
 char
1
 short
2
 float
4
 double
8
 long double
8
 char *
8
» Or any other pointer
– 11 –
Typical 32-bit
4
4
1
2
4
8
8
4
Intel IA32
4
4
1
2
4
8
10/12
4
‫סידור המידע‬
‫‪ ‬ניתן לסדר את הבתים בתוך מלים מימין לשמאל או להפך‪...‬‬
‫‪ ‬מה מקובל ? אין הסכמה‬
‫‪‬‬
‫‪‬‬
‫‪Sun’s, Mac’s are “Big Endian” machines‬‬
‫‪ ‬הבית הימני (‪ (least significant byte‬בכתובת הגבוהה‬
‫‪Alphas, PC’s are “Little Endian” machines‬‬
‫‪ ‬הבית הימני בכתובת הנמוכה‬
‫– ‪– 12‬‬
‫דוגמה‬
‫‪Big Endian‬‬
‫‪‬‬
‫הבית הימני בכתובת הגבוהה‬
‫‪Little Endian‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫הבית הימני בכתובת הנמוכה‬
‫‪= 0x01234567‬‬
‫‪x‬‬
‫למשתנה ‪ x‬יש ייצוג ב ‪ 4‬בתים‪.‬‬
‫נניח שהכתובת של ‪( x‬כלומר ‪ )&x‬היא ‪0x100‬‬
‫‪0x100 0x101 0x102 0x103‬‬
‫‪67‬‬
‫‪45‬‬
‫‪23‬‬
‫‪01‬‬
‫‪0x100 0x101 0x102 0x103‬‬
‫‪01‬‬
‫‪23‬‬
‫‪45‬‬
‫‪Big Endian‬‬
‫‪Little Endian‬‬
‫‪67‬‬
‫– ‪– 13‬‬
‫כיצד נראה איך המידע מיוצג‬
‫תוכנית להדפסת ייצוג בבתים‬
typedef unsigned char *pointer;
void show_bytes(pointer start, int len)
{
int i;
for (i = 0; i < len; i++)
printf("0x%p\t0x%.2x\n",
start+i, start[i]);
printf("\n");
}
‫בכמה תעלה‬
? ‫כאן הכתובת‬
– 14 –
Printf directives:
%p: Print pointer
%x: Print Hexadecimal
show_bytes ‫נפעיל את‬
‫ האורך‬:4 ‫מחזיר‬
int ‫בבתים של‬
int a = 15213;
printf("int a = 15213;\n");
show_bytes((pointer) &a, sizeof(int));
‫ לכן‬,‫ ביטים‬8 = ‫בית‬
2 ‫ניתן לייצג אותו עם‬
Hex. ‫תוים ב‬
Result (Linux):
int a = 15213;
‫ארבעת הבתים‬
‫ שימו‬.a ‫לייצוג‬
‫לב לכתובות‬
.‫העוקבות‬
– 15 –
0x11ffffcb8
0x6d
0x11ffffcb9
0x3b
0x11ffffcba
0x00
0x11ffffcbb
0x00
‫חידה‬
‫שינוי קטן אחד‬
typedef unsigned int *pointer;
void show_bytes(pointer start, int len)
{
int i;
for (i = 0; i < len; i++)
printf("0x%p\t0x%.2x\n",
start+i, start[i]);
printf("\n");
}
printf directives:
%p: Print pointer
%x: Print Hexadecimal
– 16 –
‫נפעיל את ‪show_bytes‬‬
‫אותה קריאה כמו קודם‬
‫;‪int a = 15213‬‬
‫;)"‪printf("int a = 15213;\n‬‬
‫;))‪show_bytes((pointer) &a, sizeof(int‬‬
‫מה יהיה פלט התוכנית ?‬
‫זאת אינפורמציה‬
‫שבמקרה נמצאת‬
‫בכתובות אלה‬
‫זאת‬
‫התשובה‬
‫מקודם‬
‫‪Result (Linux):‬‬
‫;‪int a = 15213‬‬
‫‪0x0012FF1C 0x3b6d‬‬
‫‪0x0012FF20‬‬
‫‪0x12ff80‬‬
‫‪0x0012FF24‬‬
‫‪0x401264‬‬
‫‪0x0012FF28‬‬
‫‪0x251fe4‬‬
‫שימו לב להפרש‬
‫של ‪4‬‬
‫בין הכתובות‬
‫מה קרה כאן ? הכתובת ‪ start + i‬התקדמה לפי הטיפוס )‪ 1 :(type‬ב ‪ char‬ו ‪ 4‬ב ‪Int‬‬
‫– ‪– 17‬‬
integers ‫ייצוג‬
int A = 15213;
int B = -15213;
long int C = 15213;
Binary:
0011 1011 0110 1101
Hex:
3
A
B
C
6D
3B
00
00
93
C4
FF
FF
6D
3B
00
00
‫לא כל רוחב‬
.‫המילה מנוצל‬
)‫(אפסים מובילים‬
– 18 –
Decimal: 15213
B
6
D
Linux ‫ייצוג ב‬
Two’s complement ‫נובע מייצוג הנקרא‬
.‫נראה זאת בהרצאה הבאה‬
‫ייצוג מצביעים )‪(pointers‬‬
‫;‪int B = -15213‬‬
‫;‪int *P = &B‬‬
‫‪Sun Address‬‬
‫‪E‬‬
‫‪F‬‬
‫‪F‬‬
‫‪F‬‬
‫‪F‬‬
‫‪B‬‬
‫‪2‬‬
‫‪C‬‬
‫‪1110 1111 1111 1111 1111 1011 0010 1100‬‬
‫‪D4‬‬
‫‪F8‬‬
‫‪FF‬‬
‫‪BF‬‬
‫‪Hex:‬‬
‫‪Binary:‬‬
‫‪EF‬‬
‫‪FF‬‬
‫‪FB‬‬
‫‪2C‬‬
‫‪Linux Address‬‬
‫‪B‬‬
‫‪F‬‬
‫‪F‬‬
‫‪F‬‬
‫‪F‬‬
‫‪8‬‬
‫‪D‬‬
‫‪4‬‬
‫‪1011 1111 1111 1111 1111 1000 1101 0100‬‬
‫‪Hex:‬‬
‫‪Binary:‬‬
‫מסקנה ‪ :1‬מהדרים שונים ומחשבים שונים משימים כתובות שונות‬
‫מסקנה ‪ :2‬קוד שמסתמך על כתובת (מקובל ב ‪ )hashing‬יפעל שונה במחשבים שונים‪.‬‬
‫יוצר בעיות ‪porting‬‬
‫– ‪– 19‬‬
‫ייצוג שברים )‪(floats‬‬
‫בהמשך נלמד איך שברים מיוצגים‪ .‬עכשיו נראה רק דוגמה‪.‬‬
‫;‪Float F = 15213.0‬‬
‫‪Linux F‬‬
‫‪00‬‬
‫‪B4‬‬
‫‪6D‬‬
‫‪46‬‬
‫‪IEEE Single Precision Floating Point Representation‬‬
‫‪4‬‬
‫‪6‬‬
‫‪6‬‬
‫‪D‬‬
‫‪B‬‬
‫‪4‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0100 0110 0110 1101 1011 0100 0000 0000‬‬
‫‪1110 1101 1011 01‬‬
‫‪Hex:‬‬
‫‪Binary:‬‬
‫‪15213:‬‬
‫לא זהה‪ ,‬אם כי דומה‪ ,‬לייצוג מספרים שלמים‪.‬‬
‫– ‪– 20‬‬
‫ייצוג מחרוזות‬
‫;"‪char S[6] = "15213‬‬
‫‪ ‬מחרוזות ב ‪C‬‬
‫‪‬‬
‫מיוצג על ידי מערך של תוים‬
‫כל תו מקודד ב ‪ASCII‬‬
‫התו '‪ '0‬מיוצג כ ‪0x30‬‬
‫‪ ‬הספרה ‪ i‬מיוצגת כ ‪0x30 + i‬‬
‫‪‬‬
‫מחרוזת מסתיימת ב ’‪‘\0‬‬
‫‪‬‬
‫‪‬‬
‫‪Linux‬‬
‫‪31‬‬
‫‪35‬‬
‫‪32‬‬
‫‪31‬‬
‫‪33‬‬
‫‪00‬‬
‫– ‪– 21‬‬
‫ייצוג פקודות מכונה‬
‫‪‬‬
‫פקודות מקודדות כבתים‬
‫‪ ‬מחשבי ‪ RISC‬כגון ‪ Sun‬משתמשים באוסף קטן של פקודות‪ 4 :‬בתים‬
‫מספיקים לייצוג כל הפקודות‪.‬‬
‫‪ ‬מחשבי ‪CISC‬כגון ה ‪ PC -‬משתמשים בקבוצה גדולה של הוראות‪:‬‬
‫נעזרים בגודל משתנה של פקודה‪.‬‬
‫– ‪– 22‬‬
‫ייצוג פקודות‬
‫לכל פקודה יש קוד מספרי‪.‬‬
‫‪PC sum‬‬
‫‪Sun sum‬‬
‫‪55‬‬
‫‪89‬‬
‫‪E5‬‬
‫‪8B‬‬
‫‪45‬‬
‫‪0C‬‬
‫‪03‬‬
‫‪45‬‬
‫‪08‬‬
‫‪89‬‬
‫‪EC‬‬
‫‪5D‬‬
‫‪C3‬‬
‫‪81‬‬
‫‪C3‬‬
‫‪E0‬‬
‫‪08‬‬
‫‪90‬‬
‫‪02‬‬
‫‪00‬‬
‫‪09‬‬
‫)‪int sum(int x, int y‬‬
‫{‬
‫;‪return x+y‬‬
‫}‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫דוגמה זאת מתורגמת למספר פקודות בסיסיות‬
‫בשפת מכונה‪.‬‬
‫בדוגמה זאת מחשבי ‪ Alpha, Sun‬משתמשים ב ‪4‬‬
‫בתים‪.‬‬
‫בדוגמה זאת מחשבי ‪ PC‬משתמשים בפקודות‬
‫באורכים של ‪ 1,2,3‬בתים‪.‬‬
‫קידוד‬
‫הפקודה‬
‫‪sum‬‬
‫מחשבים שונים משתמשים בפקודות שונות וקידוד שונה של הפקודות‪.‬‬
‫אין סיכוי לתאימות!‬
‫– ‪– 23‬‬
‫מה עכשיו ?‬
‫‪ ‬עכשיו‪ ,‬כשראינו שאת כל סוגי המידע שהמחשב משתמש בהם‪...‬‬
‫‪‬‬
‫שלמים‪ ,‬עשרוניים‪ ,‬מחרוזות‪ ,‬פקודות‪ ,‬כתובות‪...,‬‬
‫‪ ... ‬ניתן לייצוג על ידי ‪ 0‬ו ‪... ,1‬‬
‫‪ ... ‬נרצה לראות איך המחשב יכול לבצע חישובים עם מידע זה‪.‬‬
‫‪ ‬לשם כך‪ ,‬עלינו להיזכר בלוגיקה פסוקית‪.‬‬
‫– ‪– 24‬‬
‫לוגיקה פסוקית (‪/‬בוליאנית)‬
‫פותח על ידי ‪ George Bool‬במאה ה ‪19 -‬‬
‫‪ ‬נקודד 'אמת' כ – ‪ 1‬ו 'שקר' כ ‪0 -‬‬
‫‪And‬‬
‫‪Or‬‬
‫‪| 0 1‬‬
‫‪0 0 1‬‬
‫‪1 1 1‬‬
‫‪& 0 1‬‬
‫‪0 0 0‬‬
‫‪1 0 1‬‬
‫‪Not‬‬
‫)‪Exclusive-Or (Xor‬‬
‫‪^ 0 1‬‬
‫‪0 0 1‬‬
‫‪1 1 0‬‬
‫~‬
‫‪0 1‬‬
‫‪1 0‬‬
‫– ‪– 25‬‬
‫חידות‬
‫‪ ‬כמה שערים לוגיים (= פונקציות בוליאניות מעל ‪ 2‬משתנים)‬
‫שונים ניתן לבנות ?‬
‫‪‬‬
‫‪16‬‬
‫‪ ‬כמה פונקציות בוליאניות שונות יש מעל ‪ n‬משתנים ?‬
‫‪‬‬
‫‪n‬‬
‫‪22‬‬
‫‪ ‬מה המספר המינימלי של שערים לוגיים שונים אשר דרוש כדי‬
‫לייצג את כל הפונקציות הבוליאניות ?‬
‫– ‪– 26‬‬
‫הכל זה טרנזיסטורים‪...‬‬
‫כיצד באמת המתג נפתח ? "מוליכים למחצה‪"...‬‬
‫– ‪– 27‬‬
:‫ניתן לחשוב על מימוש השערים באופן הבא‬
Input 1
Input 2
And gate
Input 1
Input 2
– 28 –
Or gate
Q=A&B
Q=A|B
– 29 –
‫משערים לפונקציות בוליאניות‬
‫ננסה לבנות פונקציה מורכבת יותר מהשערים הבודדים‪:‬‬
‫– ‪– 30‬‬
‫נשוה אלגברה בוליאנית לאלגברה אריתמטית‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫נציב ’|‘ = ’‪ ‘+‬ו ’&‘ = ’*‘‪.‬‬
‫תרגיל‪:‬‬
‫עבור כל אחד מהביטויים הבאים – קבעו אם הביטוי המקביל נכון‪.‬‬
‫קומוטטיביות‬
‫‪A|B = B|A‬‬
‫‪A&B = B&A‬‬
‫אסוציאטיביות‬
‫‪A+B = B+A‬‬
‫‪A*B = B*A‬‬
‫)‪(A + B) + C = A + (B + C‬‬
‫)‪(A * B) * C = A * (B * C‬‬
‫– ‪– 31‬‬
‫נשוה אלגברה בוליאנית לאלגברה אריתמטית‬
‫‪‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪.7‬‬
‫‪.8‬‬
‫‪ ...‬המשך‬
‫‪A * (B + C) = A * B + A * C‬‬
‫‪A+0 = A‬‬
‫‪A|A = A‬‬
‫‪A&1 = A‬‬
‫‪A*0 = 0‬‬
‫)‪A | (B & C) = (A | B) & (A | C‬‬
‫‪– (– A) = A‬‬
‫‪A+AA‬‬
‫– ‪– 32‬‬
‫נשוה אלגברה בוליאנית לאלגברה אריתמטית‬
‫‪‬‬
‫‪ ...‬המשך‬
‫‪.9‬‬
‫‪A&A = A‬‬
‫‪.10‬‬
‫‪A | (A & B) = A‬‬
‫‪.11‬‬
‫‪A & (A | B) = A‬‬
‫‪.12‬‬
‫‪A | ~A = 1‬‬
‫‪.13‬‬
‫‪A | ~A  0‬‬
‫– ‪– 33‬‬
‫עוד מספר התמרות בין אופרטורים‬
DeMorgan ‫חוקי‬

A & B = ~(~A | ~B)

A | B = ~(~A & ~B)
:& ְ‫ על ידי | ו‬xor


– 34 –
A ^ B = (~A & B) | (A & ~B)
A ^ B = (A | B) & ~(A & B)
^ - ‫ & ו‬:‫מספר זהויות‬
‫ מצא את הזהויות השגויות‬:‫תרגיל‬
1.
2.
3.
4.
5.
6.
7.
8.
9.
– 35 –
A^B = B^A
A&B = B&A
(A ^ B) ^ C = A ^ (B ^ C)
(A & B) & C = A & (B & C)
A & (B ^ C) = (A ^ B) & (A ^ C)
A^0 = 0
A&1 = A
A&0=0
A^A = A

‫מימוש לוגיקה פסוקית עם חומרה‬
‫‪ ‬כבר ראינו שכל פעולה לוגית ניתנת למימוש בחומרה‬
‫‪ ‬שערים לוגיים‪:‬‬
‫‪ ‬נבנה מעגל לדוגמה‪ :‬חיבור מספרים‬
‫– ‪– 36‬‬
‫חיבור וקטורים של ביטים‬
‫‪01001101 +‬‬
‫‪10000100‬‬
‫‪-----------‬‬‫‪11010001‬‬
‫‪0010101 +‬‬
‫‪1101100‬‬
‫‪-----------‬‬‫‪0000001‬‬
‫– ‪– 37‬‬
‫כיצד נממש חיבור עם לוגיקה פסוקית ?‬
‫‪ ‬נתחיל מחיבור שני ביטים ‪a,b‬‬
‫‪ ‬נוסיף ביט שלישי ‪( i‬מייצג את השארית מימין אם כחלק מחיבור‬
‫מספר גדול יותר מביט אחד)‪.‬‬
‫‪ ‬רכיב הנקרא )‪Full Adder (FA‬‬
‫‪‬‬
‫‪‬‬
‫‪ – S‬הסכום‬
‫‪ ‬ניתן לחישוב על ידי‪:‬‬
‫)‪S $ ((a ^ b)^ i‬‬
‫‪ - o‬השארית‬
‫‪ ‬ניתן לחישוב על ידי‪o $ ((a & b) | (( a ^ b) & i)) :‬‬
‫‪ ‬כלומר‪ ,‬ניתן לבנות מעגל המבוסס על פעולות בוליאניות שמממש‬
‫חיבור של ביטים‬
‫– ‪– 38‬‬
‫ועתה נחבר מספרים גדולים יותר‪...‬‬
‫‪ ‬נחבר ‪ FA‬בשרשרת‪...‬‬
‫‪ ‬נקרא לזה ‪Adder‬‬
‫‪ ‬באופן דומה ניתן לממש פעולות אריתמטיות אחרות‬
‫‪ ‬כל מעבד מכיל (ברכיב הנקרא ‪ )ALU‬מימוש דומה לזה של‬
‫פעולות אריתמטיות‬
‫– ‪– 39‬‬
‫מביטים לוקטורים של ביטים‬
‫פעולות על וקטורים של ביטים‬
‫‪‬‬
‫פעולות מבוצעות לחוד עבור כל ביט )‪(bitwise‬‬
‫‪~ 01010101‬‬
‫‪10101010‬‬
‫‪10101010‬‬
‫‪01101001‬‬
‫‪^ 01010101‬‬
‫‪00111100‬‬
‫‪00111100‬‬
‫‪01101001‬‬
‫‪| 01010101‬‬
‫‪01111101‬‬
‫‪01111101‬‬
‫‪01101001‬‬
‫‪& 01010101‬‬
‫‪01000001‬‬
‫‪01000001‬‬
‫– ‪– 40‬‬
‫ייצוג וחישוב על קבוצות‬
‫‪ ‬ייצוג‬
‫‪‬‬
‫וקטור ביטים ברוחב ‪ w‬יכול לייצג תתי קבוצות של }‪{0,…, w–1‬‬
‫‪aj = 1 if j  A‬‬
‫‪01101001‬‬
‫} ‪{ 0, 3, 5, 6‬‬
‫‪‬‬
‫‪76543210‬‬
‫} ‪{ 0, 2, 4, 6‬‬
‫‪01010101‬‬
‫‪76543210‬‬
‫‪ ‬פעולות‬
‫} ‪{ 0, 6‬‬
‫} ‪{ 0, 2, 3, 4, 5, 6‬‬
‫} ‪{ 2, 3, 4, 5‬‬
‫} ‪{ 1, 3, 5, 7‬‬
‫‪01000001‬‬
‫‪01111101‬‬
‫‪00111100‬‬
‫‪10101010‬‬
‫‪Intersection‬‬
‫‪Union‬‬
‫‪Symmetric difference‬‬
‫‪Complement‬‬
‫&‬
‫|‬
‫^‬
‫~‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫– ‪– 41‬‬
‫פעולות על ביטים ב ‪C‬‬
‫הפקודות ^ ‪ &, |, ~,‬קיימות ב ‪C -‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫רלבנטי לכל ה ‪:integers‬‬
‫‪long, int, short, char ‬‬
‫מופעל על המספר בייצוגו הבינארי‬
‫מופעל בנפרד על כל ביט‬
‫זכרו‪:‬‬
‫‪416=01002‬‬
‫‪116=00012‬‬
‫דוגמאות על משתנה מסוג ‪:char‬‬
‫‪~0x41 --> 0xBE‬‬
‫‪~010000012 --> 101111102‬‬
‫‪‬‬
‫‪~0x00 --> 0xFF‬‬
‫‪~000000002 --> 111111112‬‬
‫‪‬‬
‫‪0x69 & 0x55 --> 0x41‬‬
‫‪011010012 & 010101012 --> 010000012‬‬
‫‪‬‬
‫‪0x69 | 0x55 --> 0x7D‬‬
‫‪011010012 | 010101012 --> 011111012‬‬
‫‪‬‬
‫– ‪– 42‬‬
‫פעולות " ִזי ַזה" )‪(shifting‬‬
‫‪ ‬הזזה שמאלה‪:‬‬
‫‪‬‬
‫‪‬‬
‫הזז וקטור ‪ x‬שמאלה ב ‪ y‬מקומות‬
‫זרוק ביטים משמאל ומלא ב – ‪ 0‬מימין‬
‫‪ ‬הזזה ימינה‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪x << y‬‬
‫‪x >> y‬‬
‫הזז וקטור ‪ x‬ימינה ב ‪ y‬מקומות‬
‫זרוק ביטים מימין‬
‫שני מקרים‪:‬‬
‫‪ ‬הזזה לוגית )‪ :(logical shift‬מלא ב ‪0‬‬
‫משמאל‬
‫‪ ‬הזזה אריתמטית )‪:(arithmetic shift‬‬
‫שכפל הספרה השמאלית )‪.(msb‬‬
‫משתמשים בזה בייצוג ‪2’s‬‬
‫‪ complement‬שעוד נלמד‪.‬‬
‫‪01100010‬‬
‫‪Argument x‬‬
‫‪00010000‬‬
‫‪<< 3‬‬
‫‪00011000‬‬
‫‪Log. >> 2‬‬
‫‪00011000‬‬
‫‪Arith. >> 2‬‬
‫‪10100010‬‬
‫‪Argument x‬‬
‫‪00010000‬‬
‫‪<< 3‬‬
‫‪00101000‬‬
‫‪Log. >> 2‬‬
‫‪11101000‬‬
‫‪Arith. >> 2‬‬
‫– ‪– 43‬‬
‫כיצד נגלה את הביט ה ‪i-‬‬
‫ערך הסיבית הימנית של ‪:int x‬‬
‫;‪int res‬‬
‫;‪res = x & 1‬‬
‫מקובל להשתמש במסכות‪ .‬מציאת הסיבית ה – ‪ k + 1‬מימין‪:‬‬
‫;‪int mask‬‬
‫;‪mask = 1 << k‬‬
‫;‪res = (x & mask) != 0‬‬
‫– ‪– 44‬‬
‫ובניגוד לכך‪ :‬פעולות לוגיות ב ‪C -‬‬
‫פעולות לוגיות ב – ‪: C‬‬
‫‪‬‬
‫! ‪&&, ||,‬‬
‫‪ ‘0’ ‬מייצג שקר‪ '1' ,‬אמת‬
‫‪ ‬כל מספר שונה מ – ‪ 0‬הוא 'אמת'‬
‫‪ ‬פעולה בוליאנית תמיד מחזירה ‪ 0‬או ‪1‬‬
‫שימו לב‬
‫להבדל בין‬
‫~ל!‬
‫דוגמאות על משתנה מסוג ‪:char‬‬
‫‪0x00‬‬
‫‪0x01‬‬
‫‪0x01‬‬
‫‪0x01‬‬
‫‪0x01‬‬
‫>‪--‬‬
‫>‪--‬‬
‫>‪!0x41 --‬‬
‫>‪!0x00 --‬‬
‫>‪!!0x41 --‬‬
‫‪0x69 && 0x55‬‬
‫‪0x69 || 0x55‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫– ‪– 45‬‬
‫סיכום‬
‫הכל זה סיביות ובתים‪...‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫מספרים‬
‫תוכניות‬
‫טקסט‬
‫מחשבים שונים משתמשים בייצוגים שונים‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫רוחב מילה‬
‫סדר בתים‬
‫ייצוג‬
‫לוגיקה פסוקית מהווה כלי יסודי בהבנת פעולות המחשב‬
‫‪ ‬מצד אחד‪ ,‬היא מאפשרת חישובים מעל וקטורים של ביטים‬
‫‪ ‬מצד שני‪ ,‬ניתן לממש אותה בחומרה‪.‬‬
‫– ‪– 46‬‬