חיבור בינארי

PHTLS

New member
חיבור בינארי

שלום, אני רוצה לחבר שני ערכים בינארים Charים כך:
C3=(C1|C2)​
עכשיו, עפ"י ההגיון שלי
(C3|C2)​
צריך לתת לי בחזרה את C1.. לא ..? איפה אני טועה ? כי בתוכנה שכתבתי התוצאה לא יוצאת נכון..
 
הגיון בעייתי...../images/Emo26.gif

למה אתה חושב שזה צריך לצאת ככה?... קח לדוגמה:
a = b + c​
למה אתה חושב ש a + c יתן לך חזרה את b?? (נסה לחשוב למשל על a=3, b=2 ו-c=1) בנוסף, אתה צריך להבין ש"חיבור" במספרים בינאריים שאתה מדבר עליו כאן הוא לא חיבור אלא OR. במקרה משתמשים בחלק מהספרים באותו סימן '+' - אבל המשמעות שונה לגמרי. ב-OR עוברים bit-bit ואם בשני האופרנדים הוא 0 - אז גם בתוצאה הוא יהיה 0, אחרת הוא יהיה שווה 1. תוודא שאתה מבין את ההבדל. הוא מאוד חשוב... למשל - באריתמטיקה רגילה, אם a+b = a+c אז b = c. אבל - אם a|b = a|c זה לא אומר כלום (תחשוב למשל מה קורה אם כל הביטים של a הם 1-ים...)
 

selalerer

New member
זה ייתן לך את C3.

האופרטור שאתה משתמש בו נקרא BitWise Or שהוא לוקח כל סיבית של אחד מהאופרנדים ועושה לה OR עם הסיבית המתאימה (הסיבית שנמצאת באותו המקום) של האופרנד השני.
 

זויברג

New member
וההסבר -

כמו שכבר כתבו, פעולת החיבור | שונה מפעולת החיבור +, לגמרי, אלא שבאלגברה בוליאנית יש חוקים בהם הפעולות מתנהגות בצורות דומות ולכן יש להם אותו שם. מה שאתה עשית הוא:
c3 = (c1 | c2) c3 = (c3 | c2)​
אבל כמו בחיבור, מיקום הסוגריים לא משנה (לא זוכר את שמו של החוק), ולכן ניתן לכתוב גם:
c3 = c3 | c2 = (c1 | c2) | c2 = c1 | (c2 | c2)​
באלגברה בוליאנית, יש חוק שאומר x + x = x, כלומר ברגע שאתה מחבר מספר עם עצמו, הוא שווה לעצמו, והרי דוגמא:
11001101 11001101 ------------ + 11001101​
ברגע שאתה מחבר מספר עם עצמו, קיימות רק שתי אפשרויות של חיבור ביטים: (1 + 1) ששווה 1 באלגברה בוליאנית, ו- (0 + 0), שבאלגברה בוליאנית ובכל אלגברה שאני מכיר, שווה 0. לכן אין שינוי, ואז אפשר לכתוב:
c3 = c1 | c2 c3 = c3 | c2 = c1 | c2 | c2 = c1 | c2​
ולכן אין השורה השניה בכלל לא משנה את הערך של c3, וקומפלייר ממש טוב אפילו ימחק שורה כזאת בקומפליציה (אני רוצה להאמין לפחות, בעולם אידיאלי)...
 
למעלה