לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #8  
ישן 27-11-2004, 18:46
  AlexKarpman AlexKarpman אינו מחובר  
 
חבר מתאריך: 20.12.01
הודעות: 20,962
וכעת הוכחה מהירה שהקוד באמת פועל:
בתגובה להודעה מספר 1 שנכתבה על ידי sprk78 שמתחילה ב "שאלה יפה בכל שפת תיכנות"

הגדרת הפעולה xor:
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

לפני שנמשיך, חשוב לתאר את הפעולה הזו בדרך מילולית שתעזור לנו להבין למה הקוד ההוא פעל.
אם נסתכל למשך יותר משבריר שניה על הטבלה נראה ש-xor בודקת האם שני הפרמטרים שלה
זהים או שונים. אם הם זהים היא מחזירה 0 ואם הם שונים היא מחזירה 1.

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

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

עכשיו, הקוד:
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

עכשיו בואו ננתח את הקוד בהתאם לארבעת המצבים השונים האפשריים עבור ערכים תחיליים
של שני הפרמטרים, A ו-B:
נתחיל מ-B=1, ונראה מה הולך פה. אם גם A=1, אז אחרי השורה הראשונה A=0; אחרי השורה
השניה B=1; ואחרי השורה השלישית שוב A=1. אם A=0 אז אחרי השורה הראשונה A=1; אחרי
השורה השניה B=1; ואחרי השורה השלישית A=0.
אם נעשה את אותה בדיקה עבור שני המקרים האחרים נראה שהקוד באמת "מחליף" את הערכים
של שני הפרמטרים, ועפ"י הגדרת הפעולה xor עבור משתנים השונים מביט-בודד, אנחנו רואים
שזה יפעל תמיד.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #14  
ישן 28-11-2004, 11:51
צלמית המשתמש של fat fish
  fat fish fat fish אינו מחובר  
 
חבר מתאריך: 20.06.03
הודעות: 5,616
דרך טובה להסביר היא לתת דוגמה.....
בתגובה להודעה מספר 13 שנכתבה על ידי AlexKarpman שמתחילה ב "לא מסובך:"

(:

אלכס מתכוון לדבר הבא:
משתנה מסוג int הוא בגודל 16 סיביות (נלך על unsign בשפת C) ולכן אתה יכול להזין לתוכו מספרים עד גודל של 65,000 בערך.
בהנחה ותנסה את בתהליך המתמטי על זוג מספרים שערכם גדול מ-65,000 (לדוגמה 50,000 ו-35,420) החיבור שלהם (מהצורה שהצגת a=a+b) יהיה יותר ממה שהמשתנה מסוגל להחזיק ולכן התוצאה שתתקבל תהיה שגוייה עקב זליגה.

פעולות על סיביות (XOR) רק מחליפות את מצב הסיביות ולא מבצעות פעולה העלולה ליצור זליגה (לא!! כל פעולה על סיביות, רק XOR ו- NOT לא גורמות זליגה).

לכן מבחינה מתמטית שניכם צודקים, מבחינה תכנותית, השיטה של אלכס תעבודה בכל מצב, בעוד השיטה שלך תצריך ביצוע בדיקות - היא נכונה אך לא יעילה...

_____________________________________
[ זיו ]
[ fat fish ]

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 21:38

הדף נוצר ב 0.06 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר