facebook pixel מדריך: פירוט שפת תכנות - >>, << (הזזת סיביות שמאלה וימינה) - www.4project.co.il
Main logo www.4project.co.il
כל הרכיבים לפרוייקט שלכם
עגלת קניות

העגלה ריקה

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


2022-06-14 11:03:08
בשפת 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.