1 min. read

טיפ תכנותי: 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.
ניתן לקרוא עליהם כאן:

Variables

הפתרון הפשוט מורכב מ-2 חלקים,

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

  2. השימוש במספר בתנאי,
    למשל אם אני אכתוב if (1) { ...} אז התוכנה מתייחסת למספרים ששונים מ-0 כתנאי נכון.
    ואם זה 0 אז התנאי לא נכון.
    לכן אני יכול לבדוק תוצאה של XOR ללא בדיקה ישירה ושימוש באופרטור הבדיקה “==”.

התוצאה:

1
2
3
4
5
6
7
8
auto x = 5;
auto y = 4;

if(x ^ y)
{
/* They are not the same */
}

אם אני נכנס לתנאי הזה ז”א שהמספרים לא שווים כי קיבלתי שונה מ-0.
אם זה היה 0, הקוד לא היה נכנס לבלוק של התנאי.

תודה על הקריאה!


אהבתם? מוזמנים להביע תמיכה כאן: כוס קפה