d ++ возвращает значение d, которое было до его увеличения. Это тогда разыменовывается *, и это местоположение - то, на чем выполняется | =. Таким образом, данные в местоположении до увеличения d будут иметь в своем составе (b & 0x0F).
В общем, если порядок операций в строке кода с первого взгляда неясен, рефакторируйте строку в составляющие ее операции, пока она не станет. Сгенерированный код не становится быстрее или компактнее, просто помещая множество операций в одну строку C! Нет веских оснований жертвовать таким пониманием. Заменить строку на
*d |= (b & 0x0F);
d++;