In extractBit, if you shift first, you can mask with 1 instead of (1<<pos). Considering that pos is an argument of the function, that saves a computation.
return (byte >> pos) & 1;
In the second function, I would assert that startingPos and offset are both positive instead of asserting that their sum is positive, it makes more sense that way.