(Примечание: мы обычно нумеруем вещи, начиная с 0, в компьютерных науках, поэтому я интерпретировал ваши требования с нуля.)
Используйте комбинацию маскирования и сдвига.Например, если вы хотите иметь возможность восстановить значение NetworkModule, создайте маску, содержащую 1 бит в нужных вам позициях и 0 битов везде:
#define NetworkModuleMask 0x3E00 // that is, 0011 1110 0000 0000
Теперь вы можете использовать эточтобы замаскировать нежелательные биты, используя побитовое AND:
int address = 0x1144;
int networkModule = address & NetworkModuleMask
Другой способ сделать это, который по сути эквивалентен, состоит в использовании операторов деления и по модулю со степенями 2. Например, ваша NetworkGroup является
Затем, чтобы интерпретировать значение как число, вам нужно сместить его вправо на 9 бит:
#define NetworkModulePosition 9
networkModule = networkModule >> NetworkModulePosition
Вы можете использовать аналогичный процесс для создания адреса, используя значения компонентов:сдвиньте каждую часть в положение, а затем поразрядно ИЛИ в адрес.
Вы также можете решить задачу арифметически, используя операторы деления и по модулю со степенями 2. Деление целого числа на степень 2 равносдвигая его вправо на некоторое количество битов, и по модулю на степень 2 то же самое, что сдвигать некоторое количество битов вправо и затем очищатья число бит слева, так что вы в конечном итоге делаете то, что мы сделали выше.Например, ваше значение NetworkGroup
является младшими 8 битами адреса, поэтому вы можете восстановить его, взяв адрес mod 2 ^^ 8 или 256. NetworkType
- это старшие 2 бита, и вы можете восстановить эторазделив адрес на 2 ^^ 14 или 16384.