פעולה על סיביות – הבדלי גרסאות

תוכן שנמחק תוכן שנוסף
מאין תקציר עריכה
תגית: גרשיים שגויים
שורה 9:
הפעולה''' NOT''' על סיביות, או '''השלמה''', היא [[פעולה אונארית]] שמבצעת [[לא (לוגיקה)|שלילה לוגית]] עבור כל אחת מהסיביות, ומייצרת את המספר [[משלים ל-1|המשלים ל־1]] עבור ערך בינארי נתון. סיביות שהיו 0 הופכות להיות 1, וסיביות שהיו 1 הופכות להיות 0. לדוגמה:
NOT 0111 (שערכו 7 בבסיס דצימלי)
1000 = (ערכו 8 בבסיס דצימלי)
תוצאתה של פעולת השלמה שכזו תמיד תהיה גדולה באחד מהייצוג של המספר שעליו בוצעה הפעולה בצורת ה[[משלים ל-2|משלים ל־2]]. אם משתמשים בשיטת המשלים ל־2, אז:
: NOT ''x'' = -''x'' - 1.
שורה 16:
=== AND ===
הפעולה '''AND''' על סיביות לוקחת שני ייצוגים בינאריים של מספרים באורך זהה, ומבצעת פעולת [[וגם (לוגיקה)|וגם לוגית]] על כל זוג סיביות תואם על ידי הכפלה שלהם. זאת אומרת שאם שתי הסיביות הן 1, הסיבית שתצא היא 1 (שכן 1 × 1 = 1); אחרת, התוצאה היא 0 (שכן 1 × 0 = 0 וגם 0 × 0 = 0). לדוגמה:
0101 (שערכו 5 בבסיס דצימלי)
AND 0011 (שערכו 3 בבסיס דצימלי)
0001 = (שערכו 1 בבסיס דצימלי)
ניתן להשתמש בפעולה כדי להחליט האם סיבית מסוימת דלוקה (1) או כבויה (0). לדוגמה, כדי להחליט האם הסיבית השנייה דלוקה בתוך רצף הסיביות 0011 (שערכו הדצימלי 3), ניתן להשתמש בפעולה AND על רצף סיביות שכולל 1 רק בסיבית השנייה:
0011 (שערכו 3 בבסיס דצימלי)
AND 0010 (שערכו 2 בבסיס דצימלי)
0010 = (שערכו 2 בבסיס דצימלי)
מכיוון שהתוצאה 0010 אינה אפס, אנחנו יודעים שהסיבית השנייה ברצף הסיביות המקורי הייתה דלוקה. לטכניקה זו קוראים  This is often called ''bit masking''. (כאנלוגיה לשימוש של הדבקת נייר דבק, או מסיכות – masks, על החלקים שאין צורך לשנות או על אלו שאין בהם עניין. במקרה זה, עשינו masking על הסיביות שאין בהן עניין.)
 
ניתן להשתמש גם בפעולה AND על־מנת לכבות את סיבית מסוימת ברצף הסיביות. לדוגמה, עבור הרצף 0110 (שערכו הדצימלי 6), אפשר לכבות את הסיבית השנייה על ידי ביצוע פעולת AND עם רצף הסיביות שבו יש אפס רק בסיבית השנייה:
0110 (שערכו 6 בבסיס דצימלי)
AND 1101 (שערכו 13 בבסיס דצימלי)
0100 = (שערכו 4 בבסיס דצימלי)
 
בזכות תכונה זו, קל לבדוק את ה[[מספר זוגי|זוגיות]] של מספר בינארי על ידי בדיקה של הסיבית התחתונה שלו. ניתן להשתמש ב־AND לכך כמו בדוגמה הבאה:
0110 (שערכו 6 בבסיס דצימלי)
AND 0001 (שערכו 1 בבסיס דצימלי)
0000 = (שערכו 0 בבסיס דצימלי)
 
לכן 6 הוא מספר זוגי.
שורה 39:
=== OR ===
הפעולה '''OR''' על סיביות לוקחת שני ייצוגים בינאריים של מספרים באורך זהה, ומבצעת פעולת [[או (לוגיקה)|או לוגית]] על כל זוג סיביות תואם. התוצאה היא 0 אם שתי הסיביות הן 0, בעוד בכל מקרה אחר התוצאה היא 1. לדוגמה:
0101 (שערכו 5 בבסיס דצימלי)
OR 0011 (שערכו 3 בבסיס דצימלי)
0111 = (שערכו 7 בבסיס דצימלי)
 
הפעולה OR יכולה לשמש כדי להדליק סיבית מסוימת ולהפוך אותה ל־1. כך, לדוגמה, ניתן להשתמש באוגר מסוים כדי לאחסן מספר, בו כל סיבית מייצגת מצב בוליאני נפרד. לפי דוגמה זו, רצף הסיביות 0010 (שערכו 2 בבסיס דצימלי) יכול לשמש כדי לאחסן מצבים של ארבעה דגלים שונים, כך שהדגלים הראשון, השלישי והרביעי מכובים, והדגל השני דלוק. ניתן לסמן את הדגל הרביעי כדלוק על ידי שימוש בפעולת OR בין ערך זה לבין רצף סיביות בו הסיבית הרביעית היא היחידה שדולקת:
0010 (שערכו 2 בבסיס דצימלי)
OR 1000 (שערכו 8 בבסיס דצימלי)
1010 = (שערכו 10 בבסיס דצימלי)
 
טכניקה זו יעילה במיוחד לאחסון מספר ערכים בוליאנים למטרות חסכון בזיכרון.
שורה 52:
=== XOR ===
הפעולה''' XOR''' על סיביות לוקחת שני ייצוגים בינאריים של מספרים באורך זהה, ומבצעת פעולת [[או מוציא|או מוציא לוגית]] על כל זוג סיביות תואם. התוצאה היא 1 אם רק הסיבית הראשונה היא 1 ''או'' אם רק הסיבית השנייה היא 1, אבל 0 אם שתי הסיביות הן 0 או ששתי הסיביות הן 1. בצורה זו אנחנו מבצעים השוואה בין שתי סיביות, כאשר התוצאה היא 1 אם שתי הסיביות שונות ו־0 אם שתי הסיביות זהות.
0101 (ערך 5 בבסיס דצימלי)
XOR 0011 (ערך 3 בבסיס דצימלי)
0110 = (ערך 6 בבסיס דצימלי)
 
ניתן להשתמש בפעולת XOR כדי להפוך את מצבן סיביות מסוימות. ניתן להפוך את המצב של סיבית מסוימת על ידי ביצוע פעולת XOR עליה עם 1. לדוגמה, בהינתן רצף הסיביות 0010 (שערכו 2 בבסיס דצימלי) ניתן להפוך את הסיבית השנייה והרביעית אם נעשה פעולת XOR עם רצף סיביות הכולל 1 במקום השני ובמקום הרביעי:
0010 (שערכו 2 בבסיס דצימלי)
XOR 1010 (שערכו 10 בבסיס דצימלי)
1000 = (שערכו 8 בבסיס דצימלי)
 
ניתן להשתמש בטכניקה זו על מנת לשנות רצפי סיביות המייצגים רצפים של מצבים בוליאנים.
שורה 83:
 
===הזזה אריתמטית===
[[Imageקובץ:Rotate left logically.svg|thumbממוזער|150px|הזזה אריתמטית לשמאל]]
[[Imageקובץ:Rotate right arithmetically.svg|thumbממוזער|150px|הזזה אריתמטית לימין]]
ב''הזזה אריתמטית'', הסיביות שמוזזות החוצה לכל אחד מהצדדים אובדות. בהזזה אריתמטית לשמאל, אפסים זזים פנימה מצד ימין; ובהזזמה אריתמטית לימין, [[סיבית הסימן]] (הסיבית המשמעותית ביותר, MSB) זזה פנימה משמאל, וכך שומרת על הסימן של רצף המספר. המשפט האחרון אינו תקף לטיוטה האחרונה של תקן [[שפת C]]. אם בוצעה הזזה על ערך שלילי, התוצאה היא "תלוית מימוש", מה שאומר שאינה עקבית במעבר בין פלטפורמות.{{הערה|{{cite book|last1=Garcia|first1=Blandine|title=INTERNATIONAL STANDARD ISO/IEC 9899:201x|date=2011|publisher=ISO/IEC|page=95|edition=201x|url=http://chimera.roma1.infn.it/SP/COMMON/iso-iec-9899-1990.pdf|accessdate=7 September 2015}}}}
 
זו דוגמה להסטת מספר בן שמונה סיביות:
 
00010111 (שערכו +23 בבסיס דצימלי) '''הזזה-לשמאל'''
= 00101110 (שערכו +46 בבסיס דצימלי)
 
10010111 (שערכו -105 בבסיס דצימלי) '''הזזה-לימין'''
= 11001011 (שערכו -53 בבסיס דצימלי)
 
במקרה הראשון, הספרה השמאלית ביותר הוזזה מחוץ לאוגר, ו־0 חדש הוזז לתוך המיקום הימני ביותר. במקרה השני, הערך הימני ביותר 1 הוזז החוצה (ייתכן שלתוך דגל הנשא) ו־1 הועתק למיקום השמאלי ביותר על מנת לשמר את הסימן (אבל לא בהכרח, לפי הטיוטה האחרונה של שפת C. ראו הערה למעלה). הזזות מרובות יכולות להתבצע במכה. לדוגמה:
 
00010111 (שערכו +23 בבסיס דצימלי) '''הזזה-לשמאלה-שתי-פעמים'''
= 01011100 (שערכו +92 בבסיס דצימלי)
 
הזזה אריתמטית לשמאל ''n'' פעמים זהה להכפלה ב־2<sup>''n''</sup> (בהינתן שלא הייתה [[גלישה נומרית]]), בזמן שהזזה אריתמטית לימין ''n'' פעמים בשיטת ה[[משלים ל-2|משלים ל־2]] זהה לחלוקה ב־2<sup>''n''</sup> ועיגול לעבר אינסוף שלילי. אם המספר הבינארי מטופל בצורת [[משלים ל-1|משלים ל־1]], אז תוצאת הפעולת של הזזה ימינה היא חלוקה ב־2<sup>''n''</sup> ועיגול כלפי 0.
 
===הזזה לוגית===
{| style="float:left;" border="0" cellpadding="0" cellspacing="0"
|-
| [[Imageקובץ:Rotate left logically.svg|thumbממוזער|150px|הזזה לוגית לשמאל]]
| [[Imageקובץ:Rotate right logically.svg|thumbממוזער|150px|הזזה לוגית לימין]]
|}
ב''הזזה לוגית'', אפסים נכנסים במקום הסיביות שיצאו. מסיבה זו, הזזה אריתמטית והזזה לוגית לשמאל הן למעשה אותה פעולה בדיוק.
שורה 115:
 
===סיבוב ללא סחיבה===
{| style="float:left;" border="0" cellpadding="0" cellspacing="0"
|-
| [[Imageקובץ:Rotate left.svg|thumbממוזער|150px|הזזה מעגלית שמאלה]]
| [[Imageקובץ:Rotate right.svg|thumbממוזער|150px|הזזה מעגלית ימינה]]
|}
 
שורה 143:
 
===סיבוב עם סחיבה===
{| style="float:left;" border="0" cellpadding="0" cellspacing="0"
|-
|[[Imageקובץ:Rotate left through carry.svg|thumbממוזער|150px|הזזה מעגלית עם סחיבה שמאלה]]
|[[Imageקובץ:Rotate right through carry.svg|thumbממוזער|150px|הזזה מעגלית עם סחיבה ימינה]]
|}
''סיבוב עם סחיבה'' דומה ל''סיבוב ללא סחיבה'', אך שני הקצוות של האוגר מופרדים על ידי [[אוגר הדגלים|דגל הנשא]]. הסיבית שמוזזת פנימה (בצד כלשהו) היא הערך הישן של דגל הנשא, והסיבית שמוזזת החוצה (בצד השני) הופכת להיות הערך החדש של דגל הנשא.
 
''סיבוב עם סחיבה'' פעם יחידה יכול לדמות הזזה לוגית או הזזה אריתמטית של מקום אחד על ידי הגדרת דגל הנשא לפני כן. לדוגמה, אם דגל הנשא מכיל 0, אז {{ללא גלישה|<code>x סובב-לימין-עם-נשיאה-באחד</code>}} הוא הזזה לוגית לימין, ואם דגל הנשא כולל עותק של סיבית הסימן, אז {{ללא גלישה|<code>x סיבוב-לימין-עם-נשיאה-באחד</code>}} הוא הזזה אריתמטית לימין. מסיבה זאת, בחלק מה[[מיקרו-בקר|מיקרו-בקרים]]ים כמו [[PCI|בקר PCI]] יש אפשרות לעשות רק ''סיבוב'' ו''סיבוב עם סחיבה'', ואין אפשרות לעשות הזזה לוגית או אריתמטית.
 
סיבוב עם סחיבה שימושי במיוחד כאשר מבצעים הזזות על מספרים שגדולים יותר מ[[מילה (מחשב)|גודל המילה]] הטבעי של המעבד, מכיוון שאם מספר גדול מאוחסן בשני אוגרים, הסיבית שמוזזת החוצה מאחד הצדדים של האוגר הראשון חייבת להיכנס בצד השני של האוגר השני. בעזרת סיבוב עם סחיבה, סיבית זו נשמרת בדגל הנשא במהלך ההזזה הראשונה, מה שמאפשר לה לזוז פנימה בהזזה השנייה בלי הכנה נוספת.