בחזרה לעמוד הבית

השימוש בסיביות

 

המספרים הרגילים בהם אנו משתמשים יום יום , כמו 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 . טבלת התוצאות היא :

 

A&B

B

A

1

1

1

0

0

1

0

1

0

0

0

0

לדוגמא : 16&31 =

                        16 – 00010000

                        31 – 00011111

                        ____________

            16&31    =    00010000 = 16  בבסיס 10 .

 

בגלל שמשתמשים ב-32 סיביות , 16 אמור להיות 00000000000000000000000000010000 , אבל יש לזה אותה משמעות כמו שכתבתי בדוגמא , אבל שם זה פחות מסורבל .

 

| - or

 

האופרטור | היא פקודה שמתייחסת למספרים משני עברי הסימן כאל מספרים בינאריים (32 ביטים – כלומר 32 מספרי 1 או 0) ומבצעת בינהם בדיקת קשר מסויימת ונותנת תוצאה . על מנת שהתשובה תהיה 1 , מספיק שאחד הביטים יהיה שווה 1 . טבלת התוצאות היא :

 

A|B

B

A

1

1

1

1

0

1

1

1

0

0

0

0

לדוגמא : 16|31 =

                        16 – 00010000

                        31 – 00011111

                        ____________

            16|31    =    00011111 = 31  בבסיס 10 .

 

 

^ - xor (Exclusive or)

 

האופרטור ^ היא פקודה שמתייחסת למספרים משני עברי הסימן כאל מספרים בינאריים (32 ביטים – כלומר 32 מספרי 1 או 0) ומבצעת בינהם בדיקת קשר מסויימת ונותנת תוצאה .על מנת שהתשובה תהיה 1 , אך ורק אחד משני הביטים צריך להיות 1 (לא שניהם) . טבלת התוצאות היא :

 

A^B

B

A

0

1

1

1

0

1

1

1

0

0

0

0

לדוגמא : 16^31 =

                        16 – 00010000

                        31 – 00011111

                        ____________

            16^31    =    00001111 = 15  בבסיס 10 .

 

 

~ - not

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

 

~A

A

0

1

1

0

לדוגמא :             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

 

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