Shifts and masks can pack two small fields into one byte-sized integer.

pack Shifting a field creates room for another field in the low bits.
unpack Shifts and masks recover each field from the packed value.

Packed Fields

high
packed_fields.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int main(void) {
    unsigned int high = 2;
    unsigned int low = 5;
    unsigned int packed = (high << 4) | low;
    unsigned int unpackHigh = packed >> 4;
    unsigned int unpackLow = packed & 15;

    printf("packed=%u high=%u low=%u\n", packed, unpackHigh, unpackLow);
    return 0;
}
#include <stdio.h>

int main(void) {
    unsigned int high = 1;
    unsigned int low = 5;
    unsigned int packed = (high << 4) | low;
    unsigned int unpackHigh = packed >> 4;
    unsigned int unpackLow = packed & 15;

    printf("packed=%u high=%u low=%u\n", packed, unpackHigh, unpackLow);
    return 0;
}
#include <stdio.h>

int main(void) {
    unsigned int high = 3;
    unsigned int low = 5;
    unsigned int packed = (high << 4) | low;
    unsigned int unpackHigh = packed >> 4;
    unsigned int unpackLow = packed & 15;

    printf("packed=%u high=%u low=%u\n", packed, unpackHigh, unpackLow);
    return 0;
}
  1. high ← 2, low ← 5, packed ← 37, unpackHigh ← 2, unpackLow ← 5

    3int main(void) {4    unsigned int high→ 2 = 2; //@high=1, 35    unsigned int low→ 5 = 5;6    unsigned int packed→ 37 = (high2 << 4) | low5;7    unsigned int unpackHigh→ 2 = packed37 >> 4;8    unsigned int unpackLow→ 5 = packed37 & 15;910    printf("packed=%u high=%u low=%u\n", packed37, unpackHigh2, unpackLow5);11    return 0;12}
    outputpacked=37 high=2 low=5
  1. high ← 1, low ← 5, packed ← 21, unpackHigh ← 1, unpackLow ← 5

    3int main(void) {4    unsigned int high→ 1 = 1;5    unsigned int low→ 5 = 5;6    unsigned int packed→ 21 = (high1 << 4) | low5;7    unsigned int unpackHigh→ 1 = packed21 >> 4;8    unsigned int unpackLow→ 5 = packed21 & 15;910    printf("packed=%u high=%u low=%u\n", packed21, unpackHigh1, unpackLow5);11    return 0;12}
    outputpacked=21 high=1 low=5
  1. high ← 3, low ← 5, packed ← 53, unpackHigh ← 3, unpackLow ← 5

    3int main(void) {4    unsigned int high→ 3 = 3;5    unsigned int low→ 5 = 5;6    unsigned int packed→ 53 = (high3 << 4) | low5;7    unsigned int unpackHigh→ 3 = packed53 >> 4;8    unsigned int unpackLow→ 5 = packed53 & 15;910    printf("packed=%u high=%u low=%u\n", packed53, unpackHigh3, unpackLow5);11    return 0;12}
    outputpacked=53 high=3 low=5