In most architectures support a single atomic instruction for logical-shift-left. For example:
- MIPS: SSL
- ARM: LSL
- x86: SHL
- AVR: LSL
PIC microcontrollers are however a more complex story. Different versions of PIC have different instruction sets, and not all include a logical-shift-left. Low-end (prior to PIC24/sdPIC) PIC instruction sets are not particularly suited to C code generation in any case since they lack direct support for many apparently insignificant C operations.
You should check your target's instruction set and the actual assembler/machine code generated by your compiler - most compilers have support for outputting assembler listings, or you can disassemble the output in your debugger or simulator, or a standalone disassembler.
In the unlikely absence of an logical-shift-left or a compiler optimisation that makes best use of the existing instruction set, you could (at no insignificant memory cost) use a look-up table to at least optimise for time, but in most cases a part with no logical-shift-left is likely to also have very small memory resources, so it is perhaps an impractical solution.