Precompute prefix sums for each bitvector:
function preprocess(bitvector)
prefix := array of size length + 1
prefix[0] := 0
for i from 0 to length - 1
prefix[i + 1] := prefix[i] + bitvector[i]
return prefix
function rank1(prefix, i)
return prefix[i]
function rank0(prefix, i)
return i - prefix[i]
stores the count of 1s in the first positions.
Time: preprocessing per bitvector, per rank query. Space: extra per bitvector.