GammaCyber

כתיבת קוד — שיעור 25

Structs, Unions, Bitfields ו-Bitwise — הנושא המלא

כל 2 משימות הקוד שנשמרו מהשיעור מופיעות כאן, עם דרישות, דוגמאות וקוד פתיחה. אפשר לכתוב פתרון בעורך המקומי וללחוץ על „בדיקת AI” לקבלת ציון, רמזים והערות.

T2 · בסיסי200 נק'~15 דק'algorithmic
היפוך Endianness (32-bit)
ממש swap32(n) שהופך את סדר הבתים של מספר 32-סיביות ללא-סימן (big↔little endian). למשל 0x12345678 → 0x78563412.
דוגמאות
hex(swap32(0x12345678)) → '0x78563412'
hex(swap32(0xFF)) → '0xff000000'
פתרון-ייחוס היפוך Endianness (32-bit) ›
def swap32(n: int) -> int: return (((n & 0xFF) << 24) | ((n & 0xFF00) << 8) | ((n >> 8) & 0xFF00) | ((n >> 24) & 0xFF))
הפתרון נשמר מקומית אוטומטית.
T3 · בינוני350 נק'~25 דק'algorithmic
חישוב sizeof עם Padding
ממש struct_size(fields) המחשב את sizeof של struct ב-C לפי כללי היישור. fields היא רשימת טיפוסים; היישור הטבעי שווה לגודל: char=1, short=2, int=4, long/double/ptr=8, float=4. כל שדה מיושר לגבול הגודל שלו (padding בין שדות), ובסוף המבנה מרופד לגבול השדה הגדול ביותר (tail padding).
דוגמאות
struct_size(['char','int','char']) → 12
struct_size(['char','char','int']) → 8
struct_size(['double','char']) → 16
פתרון-ייחוס חישוב sizeof עם Padding ›
def struct_size(fields: list) -> int: sz = {'char':1,'short':2,'int':4,'long':8,'double':8,'ptr':8,'float':4} off = 0; maxa = 1 for f in fields: s = sz[f]; maxa = max(maxa, s) if off % s: off += s - (off % s) # padding ליישור השדה off += s if off % maxa: off += maxa - (off % maxa) # tail padding ליישור המבנה return off
הפתרון נשמר מקומית אוטומטית.