
c = a + b פועלת על כל המשתנה. פעולה על סיביות פועלת על ביט בודד, בלי להתייחס לשאר הביטים.| (OR) עם מסכה (mask) שיש בה 1 במקום של הביט. הביט הנבחר יהיה תמיד 1, והשאר נשמרים. בדוגמה הערך 8 שעבר OR עם 1 נותן 9.& (AND) עם מסכה שיש בה 0 במקום הביט ו-1 בכל השאר. לדוגמה 0xF7 מכבה את הביט של הערך 8.<< מזיז את הביטים שמאלה ו->> מזיז ימינה. למשל 8 בהזזה ימינה של ביט אחד נותן 4, ובהזזה של שני ביטים נותן 2.ref, כדי שהשינוי ישמר במשתנה המקורי.הטקסט המלא של הדקות הראשונות בהרצאה «ביצוע פעולות ברמת סיביות» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אחרי שראינו מה זה אומר סיביות, מה זה אומר פתיחת משתנה בגודל בית, איך בדיוק מיוצג המספרים בזיכרון ואיך שפה בינארית נמצאת בתוך המחשב, אנחנו עוברים לביצוע פעולות ברמת הסיביות.
בשפת תכנות אנחנו יכולים לבצע פעולות כלליות על כל המשתנה ואנחנו יכולים לבצע פעולות על סיביות בודדות בתוך המשתנה. עכשיו, אם אנחנו עושים פעולה על כל המשתנה זה בעזרת האופרטורים הרגילים שאנחנו מכירים.
לדוגמה אם יש לנו int a שווה 3 ו-b שווה 4 ואנחנו לוקחים את c ומכניסים לתוכו את a ועוד b זה אומר שב-c יהיה 7. עכשיו לא ביצענו פה פעולה ברמה של סיביות בודדות, ביצענו פה פעולה ברמה של כל המשתנה.
לקחנו את כל המספר של a, חיברנו אותו עם כל המספר של b, יצא לנו שבע והכנפנו אותו לשיא. שבע ספציפית מתואר על ידי 111. אבל לא עשינו פה פעולה על סיביות בודדות.
מה הכוונה בפעולה על סיביות? הכוונה בפעולה על סיביות שאנחנו עושים פעולה בין סיבית אחת לסיבית אחרת, בלי קשר לשאר הסיביות שנמצאות בתוך המשתנה. סיבית הכוונה זה ביט, וזה שווה ל-0 או 1. כאשר יש לנו משתנה כמובן בוא נניח שגודלו הוא בית, אז הוא מורכב משמונה סיביות.
כל סיבית יש לה או 0 או 1, שמונה ביטים. אנחנו יכולים לבצע פעולה על ביט בודדת, על סיבית בודדת, בלי קשר לשאר הסיביות שיש שם.
למה זה בכלל שימושי הדבר הזה? למה לפעמים אנחנו כן רוצים לעשות בפיתוח תוכנה פעולה על סיבית בודדת, בלי קשר לשאר הסיביות במשתנה?
אז הדבר הזה שימושי כאשר אנחנו משתמשים במערכות שנחשבות מערכות real time. מערכת ריל טיים זו מערכת שנמצאת באיזשהו פרוססור או איזשהו מעבד שכרגע רץ ובזמן אמת מבצע חישובים.
כמובן שגם מחשב רץ בזמן אמת. והמערכות ריל טיים נחשבות מערכות כמו מערכות שנמצאות על פילים, שעפים וכרגע צריכים לבצע חישובים, אזעקות שפועלות בבית ומקבלות נתונים לגבי החיישנים בבית, כל מיני מכונות שתייה לדוגמה שמקבלות הוראות מהלחצנים שהיוזר לוחץ, אלו נחשבים מערכות של real time.
שם יכול להיות לנו משתנה, בואו ניקח את הדוגמה של אזעקה בבית, שיש לנו 8 אזורים, 8 זונים שנמצאים בתוך האזעקה ולדוגמה יש לנו 8 חדרים.
אז יכול להיות לנו איזשהו משתנה בגודל בית ויש לו 8 ביטים וכל cb מקבלת את הנתון שלה, את האינפוט שלה מחיישן אחר בבית. זה אומר שיכול להיות שחיישן של המטבח שולט על סיבית מספר 3. ואנחנו מגדירים שלא מעניין אותי במטבח כרגע להדליק את האזעקה אז לא אכפת לי אם החיישן נותן לי 1 או 0 לסיבית מספר 3. אבל בדוגמה במחסן כן חשוב
לי להדליק אם אני מדליק את האזעקה במחסן והחיישן של המחסן מביא לי מראה שיש שם איזה מישהו אז הסיבית במספר 7 לדוגמה נדלקת והופכת להיות 1 וברגע שזה קורה אני רוצה להדליק את האזעקה בבעיה.
אז במערכות real time יש חשיבות לביצוע פעולות על סיביות פשוטות ואנחנו הולכים לראות איך ניתן לבצע את זה. אז הפעולות שאנחנו יכולים לבצע על סיביות הן בעצם הדלקה של סיבית, זאת אומרת להפוך אותה לאחד אם היא הייתה 0 או להשאיר אותה 1 אם היא הייתה 1, כיבוי של סיבית זה אומר להפוך אותה לאפס אם היא הייתה 1 או להשאיר אותה 0 אם היא כבר
הייתה 0, בדיקה האם סיבית היא 1, בדיקה האם סיבית היא 0, תזוזה של סיביות ימינה ותזוזה של סיביות שמאלה.
בואו נראה איך עושים כל אחד מהם. נניח שיש לנו פה איזשהו משתנה אינטג'רי, נקרא לו a, והוא שווה ל-1. מה זה אומר?
זה אומר שאם אני מסתכל על מה יש לי בתוך a, אז בתוך a יהיה לי 7 אפסים ו-1. עכשיו, כאשר אנחנו משתמשים בפעולות על סיביות, ברור שאם אני מכניס 1 לתוך a זאת תמונת הסיביות שיהיה בתוכו, אבל עדיין נהוג להשתמש בתחביר של x הדצימלי ולכן עדיף לרשום 0x 01 למרות שזה אותו הדבר
אבל זה יותר ברור למי שקורא את זה שאנחנו משתמשים בקונספט של סיביות אוקיי יש לנו את b ואנחנו רוצים להכניס ל-b את מה שהיה ב-a אבל להוריד את הסיבית הזאת זאת אומרת להפוך אותה ל-0 איך אנחנו עושים את זה? אנחנו לוקחים את המשתנה a ואנחנו עושים פעולה שנקראת אור עכשיו שימו לב זה לא
or פעמיים כמו בif אלא פעם אחת אבל הקונספט הוא מאוד דומה לקונספט של or של תנאים or זאת פעולה זה אופרטור בעצם שמבצע פעולה על סיביות בודדות זאת אומרת הוא לוקח את הסיבית הראשונה בוא נניח באינדקס מספר 7 של הערך שאנחנו שמים מימין אליו ומבצע פעולה עם הערך שנמצא משמאל
אליו. בואו נגיד שמימין אנחנו מבצעים את הביטוי אנחנו לוקחים ביטוי 0x 0, 0. אז כאן בעצם אופרטור אור יבצע פעולה של אור עם כל אחת מהסידיות מול כל אחת מהסיביות.
נהוג לקחת את המספר הזה ולהגדיר אותו כמס. כלומר יש לנו פה איזושהי מסכה, ניקח 0, 0, 0. ואם אנחנו נסתכל כרגע מה יש במסכה עצמה, אנחנו נראה שיש בה בדיוק אפסים בכל מקום, לפני שזאת 0. עכשיו אם אנחנו מבצעים אור, אז זה אומר שאנחנו לוקחים את הסיבית הראשונה ועושים אור עם הסיבית הראשונה.
סיבית השנייה עם הסיבית השנייה, סיבית השלישית עם הסיבית השלישית וכולי. האמת שזאת נחשבת סיבית ראשונה, אבל העניין ברור. סיבית ראשונה עם סיבית ראשונה, סיבית שנייה עם סיבית שנייה וכולי.
אבל מה זה אומר אור? אור זה בדיוק מה שאור רגיל בשפת התכנות אומר. מספיק שאחת מהסיביות הן אחת, אוטומטית התוצאה תהיה אחת.
רק אם שתי הסיביות הן אפס, התוצאה תהיה אפס. אז מה בעצם עשינו פה? ברגע שעשינו את הדבר הזה, אז בכל מקום שיש לנו פה 0 קיבלנו את מה שהיה במשתנה הראשון.
רק במקום הראשון, אם אנחנו נשנה פה את זה ל-1 אנחנו נקבל בוודאות 1. בואו נגיד שכרגע אנחנו רוצים לעשות את המסכה כ-1.
אם אנחנו נסתכל על זה אנחנו נראה שהפעולה הזאת של אור עם מסכה של 1 תדליק בוודאות את המספר 1, כלומר את הסיבית הראשונה. בואו נסתכל ונראה ש-B יישאר 1.
אנחנו רואים שהדפסנו את b והוא 1. עכשיו שימו לב שגם אם אנחנו נשים את a כ-0 עדיין b יהיה 1 שימו לב אנחנו כמובן רוצים לבצע את זה בואו נראה עוד פעם את שני המקרים 1 עם 1 נותן לנו 1 1 עם 0 נותן לנו 1 מפני שיש כאן 1 וכל היתר אפסים זה אומר שהסיבית הזאת הולכת להיות דלוקה בכל מקרה
בתוצאה משום שהמסכה כאן היא 1 אז זה לא משנה אם פה היה 0 או פה היה 1, תוצאה של 1 אור משהו הוא 1, זה אומר שהסיבית הזאת תתדלק תמיד.
אם לדוגמה יש לנו פה 8, זה 8, ליתר דיוק זה 8. בואו נשים פה 8 תוך A. ועכשיו מה שאנחנו עושים זה מבצעים מסכה על 1.
מה שאנחנו נקבל זה כאן אנחנו נקבל את אותו ערך שהיה מקודם, זאת אומרת 1, כי 1 אור 0 זה 1, 0 אור 0 זה כמובן 0. כאן אנחנו בוודאות נדליק את הסיבית, ולכן אנחנו נקבל 1. אז מה שאנחנו נקבל זה 9.
b אמור להיות 9. בואו נריץ את זה, ונראה שb הוא 9. זאת אומרת שאנחנו בעצם משאירים את כל הסימן כמו שהוא, את כל המספר כמו שהוא, ומבצעים פעולה רק על הסיבית שאנחנו רצינו לבצע פעולה עליה.
אם לדוגמה אנחנו נרצה להדליק את הסיבית הזאת, זה אומר שאנחנו צריכים עכשיו את המספר 2. אנחנו צריכים מסכה 2. מה עכשיו יקרה?
הסיבית הזאת תישאר 1, ולכן אנחנו נקבל ב-b את הערך 1 בסיבית הזאת. הסיבית הזאת תידלק, זאת אומרת שאנחנו הולכים לקבל 10 10 שזה basically 10. בואו נריץ ונקבל 10. זאת אומרת שככה אנחנו מסוגלים בעצם לבצע את הפעולות של המסכה ופעולת אור מה שהיא עושה היא מדליקה לנו את הסיבית.
זאת הפעולה הראשונה. פעולה שנייה שאנחנו יכולים לעשות זה end. end זאת הפעולה ההפוכה ומה שהיא עושה היא מחבה. בואו נשים פה end.
כאן אנחנו לוקחים מסכה שהיא בדיוק הפוכה כל אחדים ורק המקום שאנחנו רוצים לחבות אנחנו שמים אותו 0, בואו נניח שאנחנו רוצים לכבות את זה, נשים פה 0 וכל היתר אחדים, מה זה בעצם המספר הזה?
זה f ולכן נשים פה f וזה 7 ולכן נשים פה 7. אז אנחנו בנינו מסכה כרגע שנראית בדיוק בצורה הזאת וזה אומר שאנחנו הולכים לכבות את הסיבית הזאת כי אנחנו הולכים לבצע end עם כל סיבית מול כל סיבית.
מה end אומרת? רק אם שתי הסיביות הן 1 אז התוצאה תהיה 1 אם אחת מהן זה 0 התוצאה תהיה 0 ולכן אנחנו אמורים לקבל דבר כזה אנחנו אמורים לקבל 0 בואו נריץ את זה וקיבלנו 0 ב-B נניח שכאן יש לנו 1 מה זה בעצם המספר הזה?
המספר הזה הוא 10 בואו נשים פה 10 אם אנחנו עכשיו מבצעים מסכה של end עם המספר הזה זה אומר שאנחנו רוצים לכבות את הסיבית הזאת בלבד בלי להשפיע על הסיבית הזאת וזאת אכן תישאר 1 מפני ש-1 and 1 ייתן לנו 1. זאת אומרת שאנחנו אמורים לקבל עכשיו את המספר הזה והמספר הזה הוא 2. בואו נריץ יש לנו פה 16 בואו נראה
את השגיאה כמובן ואמור להיות 0 זה בעצם בהקסה יוצא לנו 10 וחלק השני זה 0. אוקיי בואו נבדוק ואכן קיבלנו את המספר 2 פעולה נוספת שאנחנו מסוגלים לבצע זה לבדוק האם סיבית היא דלוקה או מכובדת.
בואו נעשה את זה, ניקח כאן במספר הזה 10 10, שהוא בעצם 10 בעצה ואנחנו רוצים לדעת האם הסיבית בוא נגיד הזאת היא 1 או 0. אז אנחנו צריכים לבנות מסכה שאומרת כל אפסים ורק הסיבית שאנחנו רוצים לבדוק היא 1. לאחר מכן אנחנו יכולים לבצע פעולה של end עם הסיבית אם קיבלנו הכל אפסים זאת אומרת שהסיבית הזאת היא 0 אם קיבלנו את המסכה עצמה אז
אנחנו יודעים שהסיבית הייתה דלוקה בו היא 1. בואו נגדיר את המסכה כ-0,2 בפני