C++ Bit shift whole array (left)
For the second question you can use type_traits(is_unsigned) and enable_if.
http://en.cppreference.com/w/cpp/types/is_unsigned
http://en.cppreference.com/w/cpp/types/enable_if

For the first question:
The main difference between memmove and memcpy is that memmove can be used to relocate a piece of memory to somewhere that overlaps the memory block that you're trying to move. And therefore the original pointer will no longer be valid. So I think it's up to you how you want your function to behave, if you want the parts to be zeroed or not or leave it too the user.