Bitwise
Packed Fields
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
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;
}
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
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
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