236. Shift Left, Shift Right operators

שני האופרטורים שזוכים לפחות קרדיט בC# הם האופרטורים >>, <<.

אופרטורים אלה מוכרים לנו משפת C והם בעצם מבצעים פעולות של Shift Left וShift Right.

פעולה זו גורמת לכל הביטים לזוז שמאלה (או ימינה בהתאמה) במספר שצוין, למשל:

1
2
3
int five = 5; // 101
int twenty = five << 2; // 10100
int two = five >> 1; // 10

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

למשל בדוגמה הראשונה, התוצאה שקולה להכפלה ב2 בחזקת 2, כלומר ב4.

בדוגמה השנייה, התוצאה שקולה לחילוק ב2 בחזקת 1, כלומר בחילוק ב2.

אפשר לטעון שאופרטורים אלה לא שימושיים ולכן אינם מוכרים.

אלא שיש שימוש נחמד בהם. זוכרים את הטיפ על FlagsAttribute?

בטיפ זה ציינתי שכדי ליצור Enum של Flags צריך לדאוג ידנית שהערכים שלו יהיו חזקות של 2.

אפשר להשתמש באופרטור זה כדי לעשות זאת בצורה אלגנטית:

במקום ככה:

1
2
3
4
5
6
7
8
[Flags]
public enum Directions
{
North = 1,
South = 2,
East = 4,
West = 8
}

אפשר לכתוב ככה:

1
2
3
4
5
6
7
8
[Flags]
public enum Directions
{
North = 1 << 0,
South = 1 << 1,
East = 1 << 2,
West = 1 << 3
}

התוצאה היא אותה תוצאה, רק שזה יוצא טיפה יותר אלגנטי.

בנוסף, בלי קשר לאופרטורים, אפשר לאתחל גם ערכים אחרים בEnum בצורה יפה:

1
2
3
4
5
6
7
8
9
10
[Flags]
public enum Directions
{
North = 1 << 0,
South = 1 << 1,
East = 1 << 2,
West = 1 << 3,
NorthEast = North | East,
SouthEast = South | East
}

די יפה.

שבוע עם שיפט לשמאל טוב.

שתף