refactoring the funtions responsible for updating the fingerprint data,
so we have separate push and pop bytes that are working on updating the
bits of the fingerprint. Those are  later use in the main update()
method that takes care for both adding the contribution of a new byte
and removing the contribution of the one that fell off the sliding
window of size N