ABA


"עזרה קלה בהתעסקות בביטים עם קאסטינג.."
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15376 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15376
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   00:24   19.06.09   
אל הפורום  
  עזרה קלה בהתעסקות בביטים עם קאסטינג..  
 
   אהלן..
אני עובד עם תוכנית שבכל קריאה מקבלת 3 bytes=24 ביטים...
עכשיו אני צריך לעבוד על אותם בייטים אבל זה מסורבל לעבוד עם short int ו char כאילו 2+1..
חשבתי לעבוד עם Int רגיל שהוא 4 בתים אבל אני בעצם צריך לעשות מאין קומבינה של קאסטינג שאין לי מושג איך לעשות.
לדוגמא יש לי משהו כזה..
unsigned int example;
fread(&example,sizeof(unsigned char),3,file);
מבינים את הבעיה?
לדעתי זה איכשהו אפשרי אבל אין לי מושג איך לעשות את זה..
כאילו מה שאני רוצה זה שהבתים השמאליים של האינטגר ה8 הראשונים יהיו אפסים ושאני יעבוד על ה 24 ימניים.
תודה על העזרה.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  פשוט תעתיק את הנתונים ותבצע הזזה עם האופרטור ldan192  19.06.09 12:48 1
     ברור..ניסיתי לעשות את זה עם דוגמא מסויימת VeNom  19.06.09 14:42 2
         אה, כמובן שמימין (LSB) לשמאל (MSB). ldan192  19.06.09 15:13 3
             תודה אבל לא כ''כ הבנתי את מה שאתה מנסה להעביר.. VeNom  19.06.09 15:29 8
                 אבל ערך אסקי של אפס זה לא 0000 אלא 48 (דצימלית) ldan192  19.06.09 15:37 10
                     ברור לי הקטע הזה.. VeNom  19.06.09 15:38 12
         זה לא נכון. Deuce  19.06.09 15:27 5
             מדובר על unsigned ככה שהוא תמיד יהיה חיובי VeNom  19.06.09 15:28 7
  מכתב Deuce  19.06.09 15:21 4
     התרגיל הוא כזה VeNom  19.06.09 15:28 6
         תראה, Deuce  19.06.09 15:33 9
             זה לא אמור לעבוד על טטריס VeNom  19.06.09 15:37 11
                 כמו שאמרתי - השני. ldan192  19.06.09 15:45 13
                     אוקיי תודה,מצטער ששיגעתי אתכם VeNom  19.06.09 15:46 15
                 כמדמוני הוא קורא משמאל לימין. Deuce  19.06.09 15:46 14
                     אחלה..תודה. VeNom  19.06.09 15:47 16
                     הוא קורא ''מלמטה למעלה''. כלומר מהכתובות הנמוכות ldan192  19.06.09 15:51 17
  בקיצור תודה לכולם אני יצאתי טמבל VeNom  19.06.09 15:55 18

       
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   12:48   19.06.09   
אל הפורום  
  1. פשוט תעתיק את הנתונים ותבצע הזזה עם האופרטור  
בתגובה להודעה מספר 0
 
קטן-קטן (מחובר).
יש לך ב-C הרבה פעולות אריתמטיות בידיך כמו הזזת ביטים, קסור, AND, OR ועוד ועוד...


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   14:42   19.06.09   
אל הפורום  
  2. ברור..ניסיתי לעשות את זה עם דוגמא מסויימת  
בתגובה להודעה מספר 1
 
   אתה כנראה לא הבנת..
נניח שאני רוצה לקלוט מקובץ 3 bytes שהם 24 ביטים..
ב משתנה מטיפוס integer יש 4 בתים שהם 32 ביטים.
עכשיו א.אין לי מושג איך ה integer יודע להתעסק כלומר לאן הוא קולט את אותם 3 בתים(כי אני עדיין בשנה א') אבל לא משנה.
מה שאני רוצה לעשות(וזה לא עובד עם הזזה של 8 שמאלה או ימינה)..זה לקחת 3 בתים ולהרחיב אותם ל 4 בתים עם אפסים באחד הקצוות.
ככה שאני עושה:

int fourbytes;
fread(&fourbytes,sizeof(unsigned char),3,file);


עכשיו קלטתי 3 בתים לתוך אותו integer
מה שאני רוצה לדעת זה איך זה בפועל נראה באותו אינטגר עכשיו?
אח"כ אם אני אדע את זה אני אדע איך לשחק עם ההזזות ע"מ למלא את שאר המקומות באפסים.
תודה רבה!


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   15:13   19.06.09   
אל הפורום  
  3. אה, כמובן שמימין (LSB) לשמאל (MSB).  
בתגובה להודעה מספר 2
 
כלומר, אם תאתחל את fourbytes ל-0 תקבל את המספק 0000BBBBBBBBBBBB כאשר B זה 0 או 1 כרגיל.
תשים לב שאתה נותן לו גם &, כלומר כתובת התחלה.
אם אתה רוצה דווקא ש-4 האפסים הראשונים יתאפסו תרשום &fourbytes+1.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   15:29   19.06.09   
אל הפורום  
  8. תודה אבל לא כ''כ הבנתי את מה שאתה מנסה להעביר..  
בתגובה להודעה מספר 3
 
   כל מה שאני רוצה זה להרחיב 3 בתים לתוך משתנה עם 4 בתים שהשארית תהפוך את הבית לערך אסקי של 0.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   15:37   19.06.09   
אל הפורום  
  10. אבל ערך אסקי של אפס זה לא 0000 אלא 48 (דצימלית)  
בתגובה להודעה מספר 8
 
במקרה הזה תצטרך לבצע XOR עם 48 מוזז 16 ביטים שמאלה.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   15:38   19.06.09   
אל הפורום  
  12. ברור לי הקטע הזה..  
בתגובה להודעה מספר 10
 
   תודה רבה אחי.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   15:27   19.06.09   
אל הפורום  
  5. זה לא נכון.  
בתגובה להודעה מספר 2
 
אם יש לך מספר שהוא עם 3 בתים, זה לא נכון שכדי להרחיב אותו אתה צריך להוסיף בית עם 8 אפסים משמאל ל-MSB. כמו שאמרתי לך, במידה והמספר שלילי, אתה צריך דווקא להוסיף אחדות.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   15:28   19.06.09   
אל הפורום  
  7. מדובר על unsigned ככה שהוא תמיד יהיה חיובי  
בתגובה להודעה מספר 5
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   15:21   19.06.09   
אל הפורום  
  4. מכתב  
בתגובה להודעה מספר 0
 
אם הבנתי נכון אתה קולט בידיוק 24 ביטים, כלומר כמו שאמרת נניח אתה עובד עם short int ו-char. אם תעבוד עם integer זה לא באמת יהיה 24 ביטים. האמת שאני לא מבין מה כל כך קשה לעבוד עם 24 ביטים כשלעצמם. בכל מקרה, לא הבאת את כל התרגיל ולכן אני לא יכול לתת לך ייצוג שאני הייתי עובד איתו.

ביקשת לדעת איך מיוצג מספר ב-32 ביטים אז אני אסביר לך.
הביט השמאלי ביותר הוא sign bit, אם הוא 0 אז המספר חיובי, אם הוא 1 אז המספר שלילי. מספרים שליליים מיוצגים על ידי משלים 2, מספרים חיוביים מיוצגים רגיל. בשיטת ייצוג 24 ביט (שהמציאו לך) אז הביט ה-23 השמאלי ביותר (סופרים מ-0) יהיה סימן המספר - 0 חיובי, 1 שלילי. ניתן יהיה לייצג בחיוביים שתיים ב-23 פחות אחד. בשליליים יהיה ניתן לייצג עד מינוס 2 ב-23.

אתה רוצה לעשות sign-extension ולמספרים חיוביים זה פשוט להוסיף אפסים משמאל למספרם. כדי להרחיב מספר שלילי, צריך להוסיף אחדים משמאל למספר, כלומר קח את המספר 11111111 ותכפיל אותו בשתיים ב-24 (כלומר shift-left 24 פעמים).

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






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   15:28   19.06.09   
אל הפורום  
  6. התרגיל הוא כזה  
בתגובה להודעה מספר 4
 
   שאתה אמור לקלוט מקובץ בינארי תקין בשלשות כי יש ייצוג של שפה מסויימת ע"י 8 אותיות..שיש קידוד מסויים נגיד ש 000=A
001=B וכדומה.
עכשיו בבייט אחד יש 8 ביטים..ברגע שתקלוט שלשות תתקע ולכן אתה צריך לקלוט 24 כמינימום ע"מ שיהיה נוח לעבוד(וכן הקלט תקין).
עכשיו כדי לחלץ את הבתים אפשר לעבוד עם short int ו עם char אבל יש חיתוך בביטים האחרונים..
נגיד שאנחנו מדברים על שלשות אז בביט הראשון יש 2 שלשות ו שארית של 2..
נניח שאני קולט אותו כ short int אז יש 16 בתים בשורט אינט שזה כאילו 5 שלשות ושארית של אחד..
ולכן זה אפשרי לעבוד עם זה שלא תבין שלא,אבל אני מחפש דרך לעבוד עם אינטגר ככה שלבנות מסכות ולחלץ 3 ביטים יהיה קל.
עכשיו הבעיה שאני נמצא בה היא כזאת:
אם אני מגדיר
unsigned int mask=0;
זה מאפס 32 ביטים בתוך הזכרון שנשמר כ mask..אבל שאני קורא מקובץ בינארי לאן הוא כותב את ה 3 בתים?
כאן הבלבול שלי,עוד לא למדתי מבנה מחשבים וכל מיני קורסים שכן היו עוזרים לי.
בגדול אני רוצה לשאול איך אני מגיע למצב שאני מאתחל int קולט לתוכו 3 בתים ואת ה בית הנותר מאפס?
כלומר שיהיה לי מצב כזה לדוגמא
00000000111111010101010101011010110
השמונה השמאליים מאופסים וכל השאר הם ה 3 בתים שקלטתי מתוך קובץ לדוגמא?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   15:33   19.06.09   
אל הפורום  
  9. תראה,  
בתגובה להודעה מספר 6
 
אני יכול להכנס לפרטי קאסטינג אבל זה מתקדם מידי.
אני מציע לך לעשות דבר כזה:
תיצור את המספר בעשרוני ותשלח אותו לתוך unsigned int.
מכיוון שהמספר שנוצר יהיה חיובי אז כל מה שייכנס ל-int יהיה בידיוק רצף התווים שלך.

בעקרון הוא כותב אותם בצורה שאתה רוצה.
יחד עם זאת, קח בחשבון שזה לא יעיל במיוחד כי אתה סתם כל פעם מוסיף בית NULL כזה.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   15:37   19.06.09   
אל הפורום  
  11. זה לא אמור לעבוד על טטריס  
בתגובה להודעה מספר 9
 
   סה"כ decoding,אני מעדיף שהוא יוסיף בית אחד למשתנה מאשר לעשות עוד מלא פעולות מיותרות.
ז"א שאם נגיד יש לי כזה דבר:
7=00000111
128=10000000
140=10001100
ואני זה נראה ברצף הזה במחשב:
000001111000000010001100
לדוגמא
ואני עכשיו יש לי משתנה Int שקורא 3 בתים ברציפות הוא יציג לי אותו כ
00000111100000001000110000000000
או כ
00000000000001111000000010001100
?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   15:45   19.06.09   
אל הפורום  
  13. כמו שאמרתי - השני.  
בתגובה להודעה מספר 11
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   15:46   19.06.09   
אל הפורום  
  15. אוקיי תודה,מצטער ששיגעתי אתכם  
בתגובה להודעה מספר 13
 
   רציתי לדעת איך זה עובד.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   15:46   19.06.09   
אל הפורום  
  14. כמדמוני הוא קורא משמאל לימין.  
בתגובה להודעה מספר 11
 
תבין, זה לא בידיוק חוקי להתחיל להגיד לו לקרוא 3 בתים כי הוא יחפש לקרוא בית נוסף, ואני לא יודע איך C מתמודדת עם זה (לא זוכר לפחות).
תעשה ניסיון.
אם זה ין את התוצאה השנייה, תעשה פשוט shift-left שמונה פעמים, זה יסדר לך את זה.






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   15:47   19.06.09   
אל הפורום  
  16. אחלה..תודה.  
בתגובה להודעה מספר 14
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   15:51   19.06.09   
אל הפורום  
  17. הוא קורא ''מלמטה למעלה''. כלומר מהכתובות הנמוכות  
בתגובה להודעה מספר 14
 
ומתפרשים לכתובות הגבוהות.
ב-& של int יש את הכתובת ה-LSB, כלומר הנמוכה.
ולכן הוא ירשום את הביטים החל מהכתובת הנמוכה לגבוהה (כלומר, כמו שהוא רשם בדוגמא השניה).


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
VeNom  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 7.6.02
7922 הודעות, 1 פידבק
   15:55   19.06.09   
אל הפורום  
  18. בקיצור תודה לכולם אני יצאתי טמבל  
בתגובה להודעה מספר 0
 
   שכחתי להוסיף את ה Unsigned ולא הבנתי למה המספרים ענקיים שאני מבצע הזזה פשוטה..
לא הייתי צריך אפילו "להרחיב" אותו בביט נוסף כי הוא יודע לאפס אוטומטית.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net