Есть много хороших ответов, и некоторые из них технически правильные.
В более широком масштабе следует понимать, что C / C ++ не является ассемблером. Задача программиста - попытаться сообщить компилятору о намерениях, которых вы хотите достичь. Компилятор выберет лучший способ сделать это в зависимости от архитектуры и различных флагов оптимизации.
x & = 0x0F; это самый понятный способ сообщить компилятору, чего вы хотите достичь. Если на какой-то архитектуре сдвиг вверх и вниз выполняется быстрее, работа компилятора заключается в том, чтобы знать это и делать правильные вещи.