Low frequency (1Hz) High pass filter
but there is a pesky DC bias that keeps changing every now and then

Fix that, if you can.  If it changes suddenly, then any filter you have is going to have odd results after the change, until it settles again.
So this is the algorithm you want (note the pseudo-C pseudo code -- data types are up to you):
static state_t state = 0;
static const cutoff_frequency = 1.0;
static const state_t gain = cutoff_frequency / (2 * PI * sampling_rate);

input_t highpass(input_t input) {
    input_t retval = input - state;
    state += gain * retval;
    return retval;
}

state_t is up to you -- it's easiest to choose 64-bit or longer floating point; excepting issues with speed or space that's almost certain to work.  Anything else and you'll need to worry about truncation.  I assume that input_t is some integer type -- if it's unsigned, you'll need to do some casting so the first line of the function works.
What this is doing is making a highpass filter by making a 1st-order infinite-impulse response lowpass filter of the input data, with unity gain, and subtracting it from the input.  As long as you have enough precision in your variables, the second line of the function insures that the output really is servoed to an average value of zero.
It's up to you to make sure that nothing overflows for extreme values of the input, and that state_t and gain fit together so that the second line of the function does not underflow (i.e., if the input changes by its smallest increment, state still &quot;sees&quot; the difference in retval after multiplied by gain.