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+AA
– – 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