Зависит от того, что нужно, правда. Если на самом деле необходимо обслуживать произвольное количество битов, то было бы лучше иметь цикл, который вылавливает биты один за другим из источника, собирает значение, а затем записывает его в место назначения после считывания нужного количества бит. , Но, если на самом деле есть только фиксированный набор ширины, то переключатель и корпус в порядке (на мой взгляд, в любом случае), так как, вероятно, яснее, что происходит. Нет смысла делать код более общим, чем нужно.
В любом случае, вероятно, было бы лучше спрятать все это за функцией или каким-либо другим средством абстракции, чтобы его можно было легко использовать повторно («каждый раз» предполагает, что этот фрагмент кода возникает в нескольких местах), а результат решения записан только в одном месте.
(Еще один комментарий, который я хотел бы сделать, заключается в том, что при использовании перечисления для представления некоторого фиксированного набора счетчиков битов каждый перечислитель должен иметь произвольное значение, а не соответствующий счетчик битов. Это лучше указывает на то, что имя не имеет никакого значения означает произвольный счетчик битов, но скорее просто токен, указывающий один из поддерживаемых счетчиков битов.)
(Также при чтении 16 битов один из байтов, вероятно, должен поступить из input[j+1]
.)