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

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



  #2  
ישן 08-01-2009, 00:27
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 1 שנכתבה על ידי h_stolero שמתחילה ב "שאלה בC"

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

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

קראי על bit shift באתר הבא, יש דוגמאות:
http://www-user.tu-chemnitz.de/~anh...hift.html#shift

מה שאני לא בטוח זה, אם אני עושה bit shifting בתוך מערך (נניח שמאלה), האם ה overflow ידרוס את הסיבית הראשונה של התו הקודם, או שלא?
אם כן, התרגיל מאוד פשוט... צריך להעביר בפעם הראשונה רק פעם אחת ב left-shift את הסיביות מהתו הראשון, בפעם השניה פעמיים, בפעם השלישית שלוש פעמים וכן הלאה...

אם אי אפשר, זה יהיה קצת מסובך יותר עם לולאה מקוננת ודרך להעביר בבינארית את המידע מתו אחד לשני.
לא מסובך יותר מדי, אבל די סיזיפי.
פלאשבקים ללימודים של אסמבלי... כל הכיף ב C זה חוסר הצורך להתעסק עם פקודות בינאריות - מה קרה שדווקא לזה אתם נטפלים?
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 09-01-2009, 20:30
צלמית המשתמש של Narxx
  משתמש זכר Narxx Narxx אינו מחובר  
 
חבר מתאריך: 21.12.04
הודעות: 30,021
בתגובה להודעה מספר 3 שנכתבה על ידי h_stolero שמתחילה ב "כי ככה המרצה החליט, זה..."

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

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

נניח שיש לך מערך של 6 תווים, כך הם יראו לפני דחיסה:
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה
תהליך הדחיסה למעשה יזיז את כל הביטים של התו הראשון פעם אחת שמאלה:
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

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

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

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

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

הדבר היחיד שאני לא מצליח למצוא באינטרנט זה איפה אני שומר את הנשא.
כיוון שאת צריכה לשים אותו בתו הקודם בכל הזזה (מלבד הראשונה) את צריכה לשמור אותו איפה שהוא, ואז את ההשמה את עושה ע"י OR
נגיד שהנשא שלך הוא "0" כמו בדוגמא מעלה, אז את צריכה לשים אותו בתא הפנוי הראשון (תא 7 בתו הראשון), אז את עושה OR בין התו הראשון לנשא שלך שהוא 00000000.
התו הראשון בדוגמא שלנו (אחרי ההזזה הראשונית) הוא: 10011100, ולכן אחרי OR נקבל:
10011100 OR
00000000
--------------
10011100
(לא מפתיע כיוון שאנחנו מוסיפים 0 לתא שכבר היה בו 0, אז התוצאה לא השתנתה).

בפעם השניה אנחנו נעשה BIT SHIFT שמאלה פעמיים ולכן התא השני יהיה: 00101000.
לתו השלישי נבצע BIT SHIFT שלוש פעמים ולכן הוא יהיה: 01011000 ונקבל נשא "01".
את הנשא "01" (שהוא למעשה גם 00000001 בבינארי) נשים ב 2 הסיביות הפנויות בתו השני באמצעות OR ונקבל:
10011100 OR
00000001
--------------
10011101
וכך העברנו את הסיביות מהתו השלישי לתו השני.
אם תבצעי את הפעולה הזו 8 פעמים, את תקבלי בפעם השמינית תו ריק לגמרי, ופה את חוסכת ודוחסת מידע.
_____________________________________
בברכה, מתן.
www.MatanNarkiss.com


נערך לאחרונה ע"י Narxx בתאריך 09-01-2009 בשעה 20:35.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

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

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

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

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



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

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

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

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