don't do 32-bit shifts on 32-bit values, as it is undefined behavior