עזרה בכתיבת תוכנית ב C++ , קבצים ופקודות ביטים - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

עזרה בכתיבת תוכנית ב C++ , קבצים ופקודות ביטים


SeaMonster

Recommended Posts

  • תגובות 33
  • נוצר
  • תגובה אחרונה

משתתפים בולטים בדיון

משתתפים בולטים בדיון

^^ בהחלט. צריך לדאוג להשתמש ב-long long (שהוא 64 ביט).

סתם בשביל ידע כללי, סביר שזה לא יפריע לפותר באופן מעשי, אבל למעשה ANSI C89 לא מגדיר long long בכלל. זה טיפוס שהוסיפו אח"כ (C99 הכניס אותו רשמית, וקבע שגודלו לפחות 64 סיביות).

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

אוקיי , אחרי מיבחן בתקשורת חזרתי לחשוב על הפיתרון לבעייה. ועלה לי בראש הרעיון הבא, ליבנות מערך בוליני בעל מיליון ביטים '0' , מה שניקרה bitarray , עבור כל מיספר שניקלט מהקובץ הביט במיקום הזה מישתנה ל '1'. ואז בבדיקה מחפשים אחר הביט שערכו נישאר '0', המיקום שלו זהו בעצם המיספר החסר.

אכשיו הבעייה היא להעביר את זה מהחלק של הרעיון למשהו כתוב...

רעיונות התקבלו בברכה.

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

תחשוב על זה ככה: נניח שאתה רוצה לייצג מערך בוליאני בגודל 8 בצורה חסכונית - כלומר, באמצעות בייט אחד בלבד. נקרא לו x.

איך ניגשים לביט במקום ה-i בבייט הזה (כאשר i הוא מספר בין 0 ל-7)? ע"י:

(x >> i) & 1

ההזזה דואגת להביא את הביט שאנחנו רוצים להיות הביט הימני ביותר, ואז ה-& דואג להשאיר רק את הביט הזה.

באותו אופן, על מנת להדליק את הביט במקום ה-i, צריך לעשות:

x |= (1 << i)

(בשביל לכבות ביט צריך לעשות פעולה אחרת, אבל זה לא נחוץ בתרגיל הזה)

מה קורה כשאתה רוצה לייצג יותר מ-8 ביט? תשתמש במערך של בייטים. כשאתה רוצה לגשת לביט במקום ה-i (או לשנות אותו), קודם כל תבדוק באיזה מקום במערך הוא נמצא, ואז תבדוק בתוך הבייט הזה איפה הוא נמצא בדיוק.

נ.ב.: אפשר להשתמש גם במערך של int, כאשר כל int מייצג 32 ביט. תכל'ס זה לא ממש משנה (אתה לא עושה שום פעולות שהייצוג הזה משנה להן).

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

הנה פונקציה שמדליקה את הביט במיקום ה-index ב-Buffer כלשהו:


#include <windows.h>

#define BITS_IN_BYTE (8)

void SetBit(PBYTE pcBuffer, DWORD dwIndex)
{
DWORD dwByteIndex = 0;
BYTE cBitMask = 0;

if (NULL == pcBuffer)
{
return;
}

dwByteIndex = dwIndex / BITS_IN_BYTE;
cBitMask = (1 << (dwIndex % BITS_IN_BYTE));

pcBuffer[dwByteIndex] |= cBitMask;
}

כדי לייעל את החיפוש אתה לא חייב לעבור ביט ביט, אלא אתה יכול לקרוא כל פעם ארבעה בתים כ-DWORD לדוגמא ואז לבדוק אם הערך שונה מ-0xFFFFFFFF, אם כן אז הביט הכבוי נמצא באחד מארבעת הבתים האלו ונשאר לך רק לחשב את המיקום המדויק שלו.

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

אני לא משתמש ב api.

כרגע נימצא בשלבי הסיום של כתיבת התוכנית וניתקלתי בבעיה , נגיד יש לי תביטוי הבא: y=2^x

ויש לי את y , איך אני מוצא את החזקה (x) , חשבתי על הפונקציה log , אבל היא פועלת לפי בסיס 10.

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

אתה יכול להשתמש בנוסחת מעבר בין בסיסים:

d6ebf1f1efb6ddc379bc68d1ff0c0447.png

חוץ מזה, אם אתה יודע ש-x הוא חזקה של 2, יש דרכים יותר פשוטות ומדוייקות (בלי להתעסק עם לוגים) - פשוט תמצא את הביט הדלוק במספר (או ע" חיפוש פשוט, או ע"י קיצורי דרך כלשהם).

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

התוכנית עובדת , לאחר שהפונקציה log עשתה לי בעיות ולא הייה לי כוח להתחיל לריב איתה מצאתי את החזקה על ידי חילוק המיספר ב 2 וספירת מיספר הפעמים שהמיספר מיתחלק עד שהוא מגיע ל 0.

תודה רבה על העזרה! :xyxthumbs:

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

ארכיון

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


×
  • צור חדש...