חידה שנזכרתי בה:

אלדד28

New member
אה, זה כמעט כמו ב-CPP,

pair p<int,int> = make_pair(a,b); a=p.second(); b=p.first();​
 

אלדד28

New member
חוץ מזה, עוד הערה על כל השרשור,

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

neko

New member
למה XOR רלוונטי רק למספרים

שלמים? רלוונטי לכל שני משתנים מאותו טיפוס.
 
רגע רגע

הסיבה שזה לא עובד, לא קשורה לעבודה שהמספרים הם לא שלמים, אלא לעובדה שהומפיילר של C++ לא תומך בפעולות XOR על מספרים לא שלמים. אם היית כותב שגרת XOR על BUFFER כלשהו בזיכרון, בגודל כלשהו, והיית מפעיל אותה על המספרים האלה, אז הכל היה עובד מצויין. הנקודה בשאלה המקורית (שלא היתה מחודדת מספיק), היא לבצע את ההחלפה *ללא שימוש בזיכרון נוסף*. חוץ מזה, תממש את זה איך שבא לך.
 

אלדד28

New member
ברור.

זה לא עובד כי שיטת הייצוג לא מתאימה לטריק הזה. השאלה המקורית, למרות שאני משוכנע שגלעד פשוט פישל שם, הייתה לגבי שני "משתנים", ולאו דווקא שלמים.
 

אלדד28

New member
(להתעלם מהתשובה למעלה)

מה שאתה אומר נכון, בתנאי שהייצוג של הנקודה הצפה הוא קבוע מבחינת מיקום בתוך המספר ולא משתנה. בניגוד למספרים שלמים, שבהם יש אך ורק שיטה אחת ברורה לייצוג, מספרי נקודה צפה עשויים להיות מיוצגים בצורות שונות, ולכן אי אפשר לסמוך על XOR במקרים כאלו (וזו גם הסיבה שקומפיילרים לא תומכים בפעולת XOR על מספרי נקודה צפה).
 
אני מניח

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

WolfHead

New member
מה הבעיה עם פלוסים במספרי double?

#include <iostream.h> void swap(double &x,double &y) { x=x+y; y=x-y; x=x-y; } int main() { double x=3.3,y=5.5; swap(x,y); cout<<"X:"<<x<<" Y:"<<y<<endl; return 0; }​
זה עובד...
 

אלדד28

New member
זה תלוי בייצוג של הקומפיילר ושל

המחשב את המספרים הללו. לפעמים 1 מיוצג בתור 1.000000001, למשל. מספרי נקודה צפה מתיימרים לתת לך טווח דיוק מסוים (אפסילון) ולכן אתה לא יכול לעולם לומר בוודאות שמספר נקודה צפה מסויים הוא בדיוק X. אתה יכול לומר שהוא X עם טווח שגיאה של אפסילון.
 

DNile

New member
אממממ,

סתם לידע כללי כמובן, איזה שיטת ייצוג גורמת ל1 להיות מוצגת בתור 1.0000000001 ?
 

DNile

New member
הנה חידוד של השאלה:

האם:
arr ^= arr[j] ^= arr ^= arr[j];

זהה מבחינת תוצאה סופית ל:
t = arr; arr = arr[j]; arr[j] = t;
 

UpperTrough

New member
שיטה נוספת היא להשתמש בכתובת בזכרון

ולא משתנה:
int x=1,y=2; *(int *)x = y; y = x; x = *(int *)x;​
 
למעלה