השימוש בסיביות
|
|||||||||||||||
|
|
|||||||||||||||
|
המספרים הרגילים בהם אנו משתמשים
יום יום , כמו 1 , 26 , 37 וכו' הם על בסיס דצימלי כלומר עשרוני . הבסיס הזה
לכאורה נוח מאוד לצורת המחשבה האנושית בגלל שכך חונכנו מגיל צעיר ( 10 אצבעות לי
יש ...) |
|||||||||||||||
|
לעומת זאת , המחשב לא חושב בצורה
הזאת . הצורה שבה המחשב רואה מספרים , אותיות וכל צורת מידע אחרת היא על ידי אחד
משני מאפיינים – דלוק / כבוי , 1 או 0 (זוכרים את מטריקס ?) . המחשב מייצג כל
צורת מידע על ידי הדפוס הזה . השיטה הזאת של שמירת נתונים נקראת השיטה הבינארית
(בינארי – מוכל משניים ) . לא משנה באיזה צורת כתיבה אנחנו נרשום את המספרים שלו
(דצימלית(בסיס 10) , אוקטלית(בסיס 8) או הקסאדצימלית (בסיס 16) ) המחשב יהפוך
אותה לבינארית . |
|||||||||||||||
|
בואו נסתכל קצת על צורות כתיבה של
מספרים . |
|||||||||||||||
|
|
|||||||||||||||
|
בסיס 10 – 25 המספר המוכר לנו בבסיס 10 הוא 25 |
|||||||||||||||
|
37 המספר המוכר לנו בבסיס 10 הוא 37 |
|||||||||||||||
|
|
|||||||||||||||
|
בסיס 8 – צורת הכתיבה היא 0000 (לא
מוגבל במספר ספרות), שימוש בספרות מ-0 עד 7 . |
|||||||||||||||
|
כל מספר מסמל את הכפולה של התוכן
שלו ב-8 בחזקת המיקום , לדוגמא : 0345 שווה ל- |
|||||||||||||||
|
5 * 8 ^ 0 + 4 * 8 ^ 1 + 3 * 8 ^ 2 + 0 * 8 ^ 3 = 225 |
|||||||||||||||
|
כלומר בבסיס 10 המספר שווה 225 . |
|||||||||||||||
|
|
|||||||||||||||
|
בסיס 16 – צורת הכתיבה היא 0000 (לא מוגבל במספר ספרות), שימוש בספרות מ-0 עד 9 ומ-A עד F |
|||||||||||||||
|
(במקום 10 עד 15) . כל ספרה מסמלת את הכפולה של התוכן שלה ב-16
בחזקת המיקום . לדוגמא : 1A שווה ל- 1 * 16 ^ 0 + A (10) * 16 ^ 1 = 161
בבסיס 10 . |
|||||||||||||||
|
|
|||||||||||||||
|
בסיס 2 – הבסיס הבינארי , צורת
הקריאה הרגילה של המחשב . שימוש בספרות 0 ו-1 . כל מספר מסמל את |
|||||||||||||||
|
הכפולה של התוכן שלו ב-2 בחזקת המיקום . לדוגמא – 00001001 שווה ל: |
|||||||||||||||
|
1 * 2 ^ 0 + 1 * 2 ^ 3 = 9 בבסיס 10 . |
|||||||||||||||
|
|
|||||||||||||||
|
כאשר המחשב מעבד מספר , הוא הופך
אותו לבינארי (מכיוון שכל המידע של המחשב מסתכם ב-0 ו-1 ) ואז מתחיל לחשב אותו , לדוגמא 1+1 שווה ל-2 נותן : |
|||||||||||||||
|
|
|||||||||||||||
|
00000001+ |
|||||||||||||||
|
00000001 |
|||||||||||||||
|
________ |
|||||||||||||||
|
00000010 |
|||||||||||||||
|
|
|||||||||||||||
|
כל פעולות החישוב (למעשה גם של ה-strings
) מתבצעות בצורה הזאת . |
|||||||||||||||
|
|
|||||||||||||||
|
בנוסף לפעולות המתמטיות הרגילות
ישנן גם פעולות שמופעלות רק על הביטים , נדון בהם : |
|||||||||||||||
|
|
|||||||||||||||
|
& - and |
|||||||||||||||
|
|
|||||||||||||||
|
האופרטור & היא פקודה שמתייחסת
למספרים משני עברי הסימן כאל מספרים בינאריים (32 ביטים – כלומר 32 מספרי 1 או
0) ומבצעת בינהם בדיקת קשר מסויימת ונותנת תוצאה .על מנת שהתשובה תהיה 1 , שני
הביטים צריכים להיות 1 . טבלת התוצאות היא : |
|||||||||||||||
|
|
|||||||||||||||
לדוגמא : 16&31 = |
|||||||||||||||
|
16
– 00010000 |
|||||||||||||||
|
31
– 00011111 |
|||||||||||||||
|
____________ |
|||||||||||||||
|
16&31
= 00010000 =
16 בבסיס 10 . |
|||||||||||||||
|
|
|||||||||||||||
|
בגלל שמשתמשים ב-32 סיביות , 16
אמור להיות 00000000000000000000000000010000 , אבל יש לזה אותה משמעות כמו
שכתבתי בדוגמא , אבל שם זה פחות מסורבל . |
|||||||||||||||
|
|
|||||||||||||||
|
| - or |
|||||||||||||||
|
|
|||||||||||||||
|
האופרטור | היא פקודה שמתייחסת
למספרים משני עברי הסימן כאל מספרים בינאריים (32 ביטים – כלומר 32 מספרי 1 או
0) ומבצעת בינהם בדיקת קשר מסויימת ונותנת תוצאה . על מנת שהתשובה תהיה 1 ,
מספיק שאחד הביטים יהיה שווה 1 . טבלת התוצאות היא : |
|||||||||||||||
|
|
|||||||||||||||
לדוגמא : 16|31 = |
|||||||||||||||
|
16
– 00010000 |
|||||||||||||||
|
31
– 00011111 |
|||||||||||||||
|
____________ |
|||||||||||||||
|
16|31
= 00011111 =
31 בבסיס 10 . |
|||||||||||||||
|
|
|||||||||||||||
|
|
|||||||||||||||
|
^ - xor (Exclusive or) |
|||||||||||||||
|
|
|||||||||||||||
|
האופרטור ^ היא פקודה שמתייחסת למספרים משני עברי הסימן כאל מספרים
בינאריים (32 ביטים – כלומר 32 מספרי 1 או 0) ומבצעת בינהם בדיקת קשר מסויימת
ונותנת תוצאה .על מנת שהתשובה תהיה 1 , אך ורק אחד משני הביטים צריך להיות 1 (לא
שניהם) . טבלת התוצאות היא : |
|||||||||||||||
|
|
|||||||||||||||
לדוגמא : 16^31 = |
|||||||||||||||
|
16
– 00010000 |
|||||||||||||||
|
31
– 00011111 |
|||||||||||||||
|
____________ |
|||||||||||||||
|
16^31
= 00001111 =
15 בבסיס 10 . |
|||||||||||||||
|
|
|||||||||||||||
|
|
|||||||||||||||
|
~ - not |
|||||||||||||||
|
האופרטור ~ היא פקודה שמתייחסת למספר אחד והיא
הופכת את הערך שלו . טבלת התוצאות היא : |
|||||||||||||||
|
|
|||||||||||||||
לדוגמא : 2 – 00000010 |
|||||||||||||||
|
-3 – 11111101 |
|||||||||||||||
|
____________ |
|||||||||||||||
|
|
|||||||||||||||
|
|
|||||||||||||||
|
>> - shift left |
|||||||||||||||
|
|
|||||||||||||||
|
האופרטור >> דוחף את הערכים
של הביטים כמות מסויימת של ביטים שמאלה . |
|||||||||||||||
|
השימוש באופרטור מתבצע באופן הבא : a<<b
. a הוא המספר הנדחף b פעמים . |
|||||||||||||||
|
|
|||||||||||||||
|
לדוגמא : 2<<3 = 16 |
|||||||||||||||
|
2 – 00000010 |
|||||||||||||||
|
3>>2
– 00010000 |
|||||||||||||||
|
|
|||||||||||||||
|
<< - shift right |
|||||||||||||||
|
|
|||||||||||||||
|
האופרטור >> דוחף את הערכים של הביטים כמות מסויימת של ביטים
ימינה . |
|||||||||||||||
|
השימוש באופרטור מתבצע באופן הבא : a<<b
. a הוא המספר הנדחף b פעמים . |
|||||||||||||||
|
|
|||||||||||||||
|
לדוגמא : 4<< 200= 12 |
|||||||||||||||
|
200 –
11001000 |
|||||||||||||||
|
4>>200
– 00001100 |
|||||||||||||||
|
|
|||||||||||||||
|
הערה חשובה : כאשר מדובר במספרים
בינאריים שליליים המילוי מצד שמאל מתבצע ב-1 (על מנת להשאיר את הערך שלילי) .
לעומת זאת באופרטור <<< נוצר מילוי של אפסים בצד שמאל כך שמספר שלילי
הופך למספר חיובי . נדגים את זה על 32 ביט . |
|||||||||||||||
|
|
|||||||||||||||
|
-8>>2 = 2- |
|||||||||||||||
|
8- –
11111111111111111111111111111000 |
|||||||||||||||
|
-8>>2 – 11111111111111111111111111111110 |
|||||||||||||||
|
|
|||||||||||||||
|
ולעומת זאת : |
|||||||||||||||
|
-8>>>2 = 1073741822 |
|||||||||||||||
|
8- – 11111111111111111111111111111000 |
|||||||||||||||
|
-8>>>2 –
00111111111111111111111111111110 |
|||||||||||||||
|
|
|||||||||||||||
|
למה צריך את זה ? |
|||||||||||||||
|
ובכן , בדרך כלל בפעולות סיביות
משתמשים על מנת לבצע פעולות יותר מהירות על ה-cpu של המחשב כלומר עבודה ב-real time
וכדומה . אנחנו יכולים לנצל את הטכניקה הזאת לשימושנו כמו בדוגמאות הבאות : |
|||||||||||||||
|
|
|||||||||||||||
|
דוגמא 1 : |
|||||||||||||||
|
הסקריפט הבא מתאר שימוש מקובל
בסיביות על מנת לקבל ערך של צבע : |
|||||||||||||||
|
מבנה של צבע בנוי בצורה הבאה – rrrgggbbb
, כשמדובר בספרות בבסיס דצימלי (בסיס 10) וכל צבע יכול לקבל ערך של עד 255 ,
כלומר 8 ביטים (אם כל 8 הביטים שווים ל-1 מתקבל ערך 255) . בצורה בינארית ניתן
לכתוב את המספר גם בפורמט הבא : |
|||||||||||||||
|
rrrrrrrrggggggggbbbbbbbb |
|||||||||||||||
|
|
|||||||||||||||
|
את הערך של ה-r ניתן גם לכתוב בצורה הבאה
(נניח שהערך של הצבע הוא 255) : |
|||||||||||||||
|
|
|||||||||||||||
|
000000000000000011111111 , מכיוון ש-r הוא החלק האחרון במספר . |
|||||||||||||||
|
|
|||||||||||||||
|
באותה מידה את הערך של ה-g ניתן
לכתוב בצורה הבאה : |
|||||||||||||||
|
|
|||||||||||||||
|
000000001111111100000000 (אפשר גם ללא 8 האפסים מצד שמאל) |
|||||||||||||||
|
|
|||||||||||||||
|
והנבתם כבר את הרעיון , b : |
|||||||||||||||
|
|
|||||||||||||||
|
000000000000000011111111 |
|||||||||||||||
|
|
|||||||||||||||
|
אם רוצים לשלב את כולם ביחד למספר
אחד ניתן לבדוק את הערך | של שלושתם (הבנתם את היופי ?...) |
|||||||||||||||
|
|
|||||||||||||||
|
111111110000000000000000 |
|||||||||||||||
|
| |
|||||||||||||||
|
000000001111111100000000 |
|||||||||||||||
|
| |
|||||||||||||||
|
000000000000000011111111 |
|||||||||||||||
|
---------------------------------------- |
|||||||||||||||
|
111111111111111111111111 |
|||||||||||||||
|
|
|||||||||||||||
|
וזה בדיוק כמו (255,255,255) |
|||||||||||||||
|
|
|||||||||||||||
|
החלק הכיף כאן הוא שאת הערך של ה-r ניתן לרשום גם כ-255<<16 |
|||||||||||||||
|
את g – 255<<8 |
|||||||||||||||
|
ואת b – 255 |
|||||||||||||||
|
|
|||||||||||||||
|
לכן כאשר רוצים ליצור צבע מסויים
לאובייקט color ניתן להשתמש בסקריפט : |
|||||||||||||||
|
Red=random(256);//מספר רנדומלי בין 0 ל-255 |
|||||||||||||||
|
Green=random(255); |
|||||||||||||||
|
Blue=random(255); |
|||||||||||||||
|
|
|||||||||||||||
|
Mycolor=new color(mymc); |
|||||||||||||||
|
|
|||||||||||||||
|
Mycolor.setRGB((Red<<16)|(Green<<8)|Blue); |
|||||||||||||||
|
|
|||||||||||||||
|
דוגמא 2 : |
|||||||||||||||
|
הדוגמא הבאה מאפשרת לבדוק מתוך מספר
אפשרויות , איזה מהן נבחרו . |
|||||||||||||||
|
ניצור אפשרות בחירה של הזמנת ספר
מחנות ספרים , יש למשתמש 4 אפשריות של משלוח : |
|||||||||||||||
|
אריזת מתנה , בצרוף פתק, בצרוף
פרחים , בצניחה מהשמיים . לכל אחת מהאפשרויות ניתן ערך מספרי מהערכים של 4
סיביות : 1111 כלומר : |
|||||||||||||||
|
matana=1; |
|||||||||||||||
|
petek=2; |
|||||||||||||||
|
prachim=4; |
|||||||||||||||
|
tsnicha=8; |
|||||||||||||||
|
|
|||||||||||||||
|
ברגע שהמשתמש בוחר את אחת מהאופציות
הערך שלה מתווסף ל-total . לדוגמא אם המשתמש בחר במתנה עם פרחים הערך של
ה-total יהיה 5 . |
|||||||||||||||
|
בסוף התהליך ניתן לבדוק מה היו
בחירות המשתמש על פי ה-total באופן הבא : |
|||||||||||||||
|
If (total & matana ){ |
|||||||||||||||
|
Mechir+=matanaprise; |
|||||||||||||||
|
} |
|||||||||||||||
|
כלומר אם הערך של מתנה & total
נותן true
– כלומר ערך הביט 1 במתנה שווה ל-1 , לדוגמא המשתמש בחר בפרחים
ומתנה : |
|||||||||||||||
|
1+4=5 |
|||||||||||||||
|
Matana=1 |
|||||||||||||||
|
|
|||||||||||||||
|
5 = 0101 |
|||||||||||||||
|
& |
|||||||||||||||
|
matana = 0001 |
|||||||||||||||
|
----------------------- |
|||||||||||||||
|
True |
|||||||||||||||
|
|
|||||||||||||||
|
וכך גם בשאר הערכים , וכך ניתן לדעת
על פי הסכום של התוצאה איזה בחירות בוצעו . |
|||||||||||||||
|
|
|||||||||||||||
|
|
|||||||||||||||
|
|
|||||||||||||||
|
|
|||||||||||||||
|
|
|||||||||||||||
|
|
|||||||||||||||
|
|
|||||||||||||||
|
|