איך הופכים סדר סיביות בשפת C? - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

איך הופכים סדר סיביות בשפת C?


tom123

Recommended Posts

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

דרך יותר יעילה היא כל פעם להחליף חצי מהביטים בחצי אחר מהביטים: בהתחלה מחליפים את 4 הביטים התחתונים עם 4 העליונים, ככה:

x = ((x & 0x0f) << 4) | ((x & 0xf0) >> 4) 

ואז להחליף זוגות ביטים - בכל רביעיית ביטים, להחליף את 2 הביטים העליונים עם 2 הביטים התחתונים:

x = ((x & 0x33) << 2) | ((x & 0xcc) >> 2) 

ואז להחליף את הביטים בין כל זו ביטים סמוכים:

x = ((x & 0x55) << 1) | ((x & 0xaa) >> 1) 

דרך שלישית, והכי יעילה, היא להשתמש ב-lookup table: להכין מראש מערך שמכיל את התוצאות עבור כל אחת מ-256 האפשרויות, ופשוט לגשת למערך במקום המתאים.

קישור לתוכן
שתף באתרים אחרים

השיטה השנייה הולכת ככה:

נניח שהבית שלך הוא abcdefgh (אלה מייצגים ביטים).

כשעושים x&0x0f נשאר 0000efgh, וכשעושים x&0xf0 נשאר abcd0000.

השיפטים (>> ו-<<) וה-or (ה-|) מחליפים בין שני החלקים, ונשארים עם efghabcd

עכשיו, כשעושים x&0x33 נשאר 00gh00cd, וכשעושים x&0xcc נשאר ef00ab00

השיפטית וה-or שוב מחליפים בין שני החלקים, ונשארים עם ghefcdab.

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

קישור לתוכן
שתף באתרים אחרים

כתבתי קובץ לפני כמה חודשים - צירפתי אותו - אתה מסובב לפי מספר הסיבובים שאתה בוחר

האלגוריתם הוא לספור את מספר הסיביות, לחלק ב- 10 ולהכפיל את השארית ב- 10 בחזקת מספר הסיביות וכך הסיבית מסתובבת...

[attachment deleted by admin]

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...