פירוט שפת תכנות - >>, << (הזזת סיביות שמאלה וימינה)

פורום זה מכיל תרגום לעברית של מדריכים, דוגמאות קוד, פירוט שפת תכנות לכרטיסי Arduino וחומרים לימודיים אחרים מהאתר arduino.cc

פירוט שפת תכנות - >>, << (הזזת סיביות שמאלה וימינה)

הודעהעל ידי Alex » ה' ספטמבר 18, 2014 4:21 pm

בשפת C/C++ יש שני אופרטורים של הזזת סיביות: >> - הזזה שמאלה ו-<< הזזה ימינה. פעולות אלה גורמות לסיביות של אופרנד הרשום מצד שמאל של האופרטור לזוז שמאלה או ימינה מספר פעמים המצויין באופרנד הרשום מצד ימים של האופרטור.

פרטים נוספים על מתמטיקת סיביות שאפשר למצוא כאן TODO (אנגלית).

תחביר
קוד: בחר הכל
variable << number_of_bits

variable >> number_of_bits

פרמטרים בתחביר:
variable - משתנה מסוג byte, int או long
number_of_bits integer - מספר שלם הקטן או שווה ל-32

דוגמה
קוד: בחר הכל
    int a = 5;        // binary: 0000000000000101
    int b = a << 3;   // binary: 0000000000101000, or 40 in decimal
    int c = b >> 3;   // binary: 0000000000000101, or back to 5 like we started with


כשאתם מזיזים ערך X ב-Y סיביות משאלה (x << y), אז Y סיביות השמאליות ביותר של X הולכות לאיבוד.
קוד: בחר הכל
    int a = 5;        // binary: 0000000000000101
    int b = a << 14;  // binary: 0100000000000000 - the first 1 in 101 was discarded


אם אתם בטוחים ששום סיבית עם ערך 1 לא יוצאת מתחום המשתנה, אז דרך קלה להסתכל על הזזת סיביות שמאלה זה הכפלה של מספר מצד שמאל של סימון ההזזה ב-2 בחזקת המספר מצד ימין של הסימון. לדוגמה, כדי לייצר מספרים בחזקת 2 תוכלו להשתמש בביטויים הבאים:
קוד: בחר הכל
    1 <<  0  ==    1
    1 <<  1  ==    2
    1 <<  2  ==    4
    1 <<  3  ==    8
    ...
    1 <<  8  ==  256
    1 <<  9  ==  512
    1 << 10  == 1024
    ...


כשאתם מזיזים ערך X ב-Y סיביות ימינה (x >> y) והסיבית הגבוהה ביותר היא בערך של 1, אז ההתנהגות של הפעולה תלויה בסוג הנתון של ה-X. אם סוג הנתון הוא int, אז כפי שכבר הוזכר, הסיבית הגבוהה ביותר מציינת האם המספר הוא שלילי או לא. במקרה זה מסיבות היסטוריות ערך הסיבית משוכפלת לסיביות מימינה:
קוד: בחר הכל
    int x = -16;     // binary: 1111111111110000
    int y = x >> 3;  // binary: 1111111111111110

התנהגות זו (הנקראה sign extension) היא בדרך כלל לא ההתנהגות שרציתם. במקום זה יכול להיות שתרצו שאפסים יכנסו מצד שמאל של המספר המוזז ימינה. מתברר שהכללים של הזזה ימינה שונים למספרים שלמים ללא סימן (unsigned int), אז אתם יכולים להכריח את המהדר להכניס אפסים מצד שמאל ע"י שימוש ב-typecast לסוג נתון שהוא unsigned:
קוד: בחר הכל
    int x = -16;                   // binary: 1111111111110000
    int y = (unsigned int)x >> 3;  // binary: 0001111111111110


אם אתם לא מבטלים את ה-sign extension, תוכלו להסתכל על הזזה של סיביות ימינה כעל חילוק במספר בחזקת 2. לדוגמה:
קוד: בחר הכל
    int x = 1000;
    int y = x >> 3;   // integer division of 1000 by 8, causing y = 125.



ראו גם:
פירוט שפת תכנות לסביבת Arduino


עמוד זה הוא תרגום של bitshift left (<<), bitshift right (>>) לפי רישיון Creative Commons Attribution-ShareAlike 3.0.
www.4project.co.il
כל הרכיבים לפרוייקט שלכם
סמל אישי של המשתמש
Alex
מנהל האתר
 
הודעות: 7168
הצטרף: ה' ינואר 28, 2010 8:27 pm

חזור אל תרגום מדריכים מהאתר arduino.cc

Jump box

מי מחובר

משתמשים הגולשים בפורום זה: CCBot [Bot]