Menu
Coddy logo textTech

סיבוב הביטים של מספר II

שיעור 13 מתוך 17 בקורס מניפולציה על ביטים של Coddy.

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

נניח שיש לנו את (33)10 במחשב של 8 סיביות. הוא יישמר בתור (00100001)2, אם, למשל, נסובב אותו שמאלה 3 פעמים.

  •  ראשית, הזזנו את (33)10 שמאלה 3 פעמים.
  • וכדי לשמור את הסיביות שנפלטו, הזזנו אותו ימינה 8-3 פעמים. (8 הוא מספר הסיביות שהמחשב משתמש בהן כדי למקם את המספר בזיכרון)
  • לאחר מכן ביצענו פעולת OR על x ו-y כדי לקבל את המספר המסובב.
x = 33<<300001000
y = 33>>500000001

x | y

00001001

באופן דומה אפשר לבצע הזזה מחזורית ימינה-

  • ראשית, נזיז את (33)10 ימינה 3 פעמים ונשמור את הערך הזה במשתנה.
  • לאחר מכן נזיז אותו שמאלה (8-3) פעמים ונשמור את הערך הזה במשתנה אחר.
  • לאחר מכן, באמצעות פעולת OR, נקבל את המספר המסובב.
x = 33 >> 300000100
y = 33 << 500100000

x | y

00100100

וזהו! כך אפשר לסובב את הסיביות של מספר בינארי בקלות רבה כל כך, בזכות מניפולציות על סיביות.

challenge icon

אתגר

בינוני

השלימו את הפונקציה SumLeftRightRotation() כדי להחזיר את סכום הערכים של הסיבוב שמאלה והסיבוב ימינה של המספר הנתון. 

לדוגמה, עבור המספר 20, לאחר סיבוב שמאלה מתקבל 40, ולאחר סיבוב ימינה מתקבל 10, ולכן הפלט יהיה 50, סכום הסיבובים שמאלה וימינה. 

כאן, num מייצג את המספר ו-r מייצג את מספר הסיבובים.

נסו בעצמכם

#define INT_BITS 32
using namespace std;

int SumLeftRightRotation(int num, int r) {
    // כתבו כאן את הקוד
}

כל השיעורים ביחידה מניפולציה על ביטים

תרגלו בעצמכם: קומפיילר C++ אונליין