Если каждое число составляет 4 бита, вы собираетесь использовать 8 самых младших битов символа.Во многих случаях это будут все имеющиеся биты.
Сделайте это так:
ip_vhl = ((version & 15) << 4) | (length & 15);
Предполагая, что version
- это то, что вам нужно в старших битах, и length
это то, что вы хотите в самых младших битах.& 15
гарантирует, что каждое значение имеет только 4 бита.Это в основном необходимо для значения length
, чтобы избежать перезаписи битов, выделенных для version
, если длина больше 15. Десятичная константа 15
будет записана в шестнадцатеричном виде (как 0xf
или 0x0f
) какдля многих это вопрос стиля и вкуса, который вы находите чище.
Другой способ записать «целое число, для которого n крайних правых битов установлено в 1, а все остальные в 0» - ((1 << n) - 1)
и, поскольку здесь n = 4
мы можем использовать ((1 << 4) - 1)
, что, конечно, оценивается как 15
.
Ваш код, кажется, сначала делится на length
и сохраняет его, если это то, что вы хотите сделатьВы должны сделать это перед упаковкой в сингл char
, для ясности:
length >>= 2; /* Convert from bytes to 32-bit words (or whatever). */
ip_vhl = ((version & 15) << 4) | (length & 15);