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

תוכן שנמחק תוכן שנוסף
אם מדובר בסיביות, אז: על כל אחת מהסיביות בנפרד
מ הסבת תג ref לתבנית:הערה?
תגית: גרשיים שגויים
שורה 1:
ב[[תכנות]] [[מחשבים]], '''פעולה על סיביות''' (באנגלית: '''Bitwise operation''') מופעלת על רצף [[סיבית|סיביות]] אחד או יותר, כאשר הפעולה מופעלת על כל אחת מהסיביות בנפרד. זו פעולה מהירה ופרימיטיבית הנתמכת ישירות על ידי ה[[מעבד]], ומשתמשים בה לצורך השוואות וחישובים.
 
במעבדים בעלות נמוכה, בדרך־כלל, פעולות על סיביות מהירות יותר משמעותית מפעולת חילוק, מהירות יותר מכפל ולעתים מהירות יותר באופן משמעותי מחיבור. אף־על־פי שמעבדים כיום מבצעים חיבור וכפל במהירות הזהה לפעולות על סיביות בזכות השימוש ב[[צינור עיבוד נתונים|צינור הוראות]] ובחירות אחרות הקשורות בעיצוב [[ארכיטקטורת מחשב|ארכיטקטורת מעבדים]], פעולות על סיביות בדרך־כלל משתמשות בפחות חשמל עקב השימוש בפחות במשאבים.<ref>{{הערה|{{Cite web|url = http://cmicrotek.com/wordpress_159256135/|title = CMicrotek Low-power Design Blog|accessdate = 12 August 2015|publisher = CMicrotek}}</ref>}}
 
== פעולות על סיביות ==
שורה 85:
[[Image:Rotate left logically.svg|thumb|150px|הזזה אריתמטית לשמאל]]
[[Image:Rotate right arithmetically.svg|thumb|150px|הזזה אריתמטית לימין]]
ב''הזזה אריתמטית'', הסיביות שמוזזות החוצה לכל אחד מהצדדים אובדות. בהזזה אריתמטית לשמאל, אפסים זזים פנימה מצד ימין; ובהזזמה אריתמטית לימין, [[סיבית הסימן]] (הסיבית המשמעותית ביותר, MSB) זזה פנימה משמאל, וכך שומרת על הסימן של רצף המספר. המשפט האחרון אינו תקף לטיוטה האחרונה של תקן [[שפת C]]. אם בוצעה הזזה על ערך שלילי, התוצאה היא "תלוית מימוש", מה שאומר שאינה עקבית במעבר בין פלטפורמות.<ref>{{הערה|{{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}}</ref>}}
 
זו דוגמה להסטת מספר בן שמונה סיביות:
שורה 144:
עושה השמה לתוך <code>x</code> של התוצאה של הזזת <code>y</code> שתי סיביות לשמאל, שזהה להכפלתו ב־4.
 
תוצאת ההזזה יכולה להיות התנהגות תלוית הגדרה או כזו שאינה מוגדרת, כך שהשימוש בפעולה זו מתבצע בזהירות. התוצאה של הזזה מספר פעמים הגדול מגודל המילה בלתי מוגדרת ב־C וב־{{משמאל לימין|C++}}. הזזה לימין של ערך שלילי תלויה במימוש ונהוג שלא לעשותה;<ref>{{הערה|{{cite web|title=INT13-C. Use bitwise operators only on unsigned operands|url=https://www.securecoding.cert.org/confluence/display/c/INT13-C.+Use+bitwise+operators+only+on+unsigned+operands|website=CERT: Secure Coding Standards|publisher=Software Engineering Institute, Carnegie Mellon University|accessdate=7 September 2015}}</ref>}} התוצאה של הזזה לשמאל המתבצעת על מספר עם סימן גם היא לא מוגדרת במידה והתוצאה לא יכולה להיות מיוצגת כאותו טיפוס.<ref>{{הערה|[http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/n843.htm JTC1/SC22/WG14 N843 "C programming language"], section 6.5.7</ref>}} ב־{{משמאל לימין|C#}} הזזה לימין היא אריתמטית כשהאופרנד הראשון הוא int או long. אם האופרנד הראשון הוא uint או ulong, פעולת ההזזה ימינה היא הזזה לוגית.<ref>{{הערה|{{cite web|url=http://msdn.microsoft.com/en-us/library/xt18et0d%28v=vs.110%29.aspx|title=Operator (C# Reference)|accessdate=14 July 2013|publisher=Microsoft}}</ref>}}
 
== ראו גם ==