One thing to make sure is whether you're dealing with a floating point number, or a fixed-point number. They are stored very differently in practice, with fixed-point numbers being much easier to process.
Fixed point numbers are stored the same as any other integer. The difference is when they are interpreted a decimal point is added at a bit position. For example, you could store a 16-but number, but say the last 4 bits are after the decimal point. This is sometimes referred to as 12.4, make sure you comment your code to make this clear. You also need to track whether the number is a positive-only value, or a 2's complement value.
- Floating points are stored using a mantissa and exponent. They can represent a much wider range of values, but are more complicated to manipulate.
For your second question I'm going to assume you're using fixed-point arithmetic. The decimal point is fixed and doesn't move. So for your example:
10001.11 >> 1 = 11000.11
Note that if your number is signed 2's complement, then MSBs will be copied from the MSB of the number before the shift (this maintains the sign before and after the shift).