טיפ תכנותי: Bits
יש לבדוק אם שני מספרים שווים -
ללא שימוש באופרטורים הבדיקה ==, !=, <, >, <=, >=
ללא שימוש באופרטורים האריתמטיקה +, -, *, /, %
איך בעצם פותרים?
בפרק 12 של מדריכי הפייתון הצגתי את בסיס הספירה 2, הבינארי:
BinaryFilesכל מספר יכול להיות מיוצג בבסיס ספירה 2- הבינארי.
כמו שכל מספר בבסיס 10 יכול להיות אחת מהספרות: 0,1,2,3,4,5,6,7,8,9
אז בבסיס 2 יש לנו שני ספרות בלבד: 0 ו 1.
המספר 3 למשל מיוצג בבסיס ספירה 2 כך :
11 - 3
המספר 7 יהיה 111.
לכן כל מספר יהיה מיוצג בבסיס 2 בעזרת 0 או 1. במחשבים אנו קוראים למספרים האלו ביטים - Bits.
למשל אם אני רוצה להשוות את המספרים 5 ו 4 -
4 יהיה 100
5 יהיה 101
כדי להשוות אותם ניתן להשתמש באופרטורים על ביטים כגון AND, OR, NOT וXOR.
ניתן לקרוא עליהם כאן:
הפתרון הפשוט מורכב מ-2 חלקים,
שימוש ב-
XOR
.XOR
יביא לנו פעולה הפוכה מהמספרים, אם שני הביטים הם 0 או 1 זה יביא לנו 0.
למה זה טוב? זה ייתן לנו אינדיקציה אם המספר בסופו של דבר שווה או לא.
לבצעXOR
על אותו מספר תמיד ייאפס לנו את התוצאה.השימוש במספר בתנאי,
למשל אם אני אכתובif (1) { ...}
אז התוכנה מתייחסת למספרים ששונים מ-0 כתנאי נכון.
ואם זה 0 אז התנאי לא נכון.
לכן אני יכול לבדוק תוצאה שלXOR
ללא בדיקה ישירה ושימוש באופרטור הבדיקה “==”.
התוצאה:
1 | auto x = 5; |
אם אני נכנס לתנאי הזה ז”א שהמספרים לא שווים כי קיבלתי שונה מ-0
.
אם זה היה 0
, הקוד לא היה נכנס לבלוק של התנאי.
תודה על הקריאה!