כתבו פונקציה unsigned int reverse_bits(unsigned int n) שמהפכת את סדר הביטים (ביט 0 הופך לביט 31, ביט 1 הופך לביט 30, וכו'). ממשו בלולאה.
כתבו פונקציה unsigned int extract_bits(unsigned int n, int start, int len) שמחלצת len ביטים מהמיקום start (למשל, extract_bits(0xFF00, 8, 4) יחזיר 0xF).
כתבו פונקציה unsigned int set_bits(unsigned int n, int start, int len, unsigned int val) שמכניסה את val לתוך n במיקום start באורך len.
כתבו פונקציה void print_binary(unsigned int n) שמדפיסה את הייצוג הבינארי של n (32 ספרות).
הגדירו struct בשם ip_header עם שדות סיביות שמייצגים את 20 הבתים הראשונים של IP header:
version - 4 ביטים
ihl - 4 ביטים (header length)
tos - 8 ביטים (type of service)
total_length - 16 ביטים
כתבו פונקציה שממלאת את הstruct עם ערכים: version=4, ihl=5, tos=0, total_length=60.
הדפיסו את הגודל של הstruct עם sizeof.
כתבו פונקציה uint16_t my_htons(uint16_t val) שממירה מhost byte order ל-network byte order (big-endian) באמצעות פעולות ביטיות (ללא שימוש ב-htons מהספרייה).
כתבו פונקציה uint32_t my_htonl(uint32_t val) באותו אופן ל-32 ביט.
בדקו שהפונקציות שלכם נותנות את אותה תוצאה כמו htons ו-htonl מהספרייה.