В качестве примера для объяснения кода (для простоты в 8-битном коде), скажем, aValue = 01101001
, aData = 00100110
, aPosition = 3
и aLength = 4
:
datamask = (1L << aLength) - 1;
создает маску с aLength
(4) крайними правыми битами, установленными в единицу: datamask = 00001111
.
aValue &= ~(datamask << aPosition);
очищает aLength
(4) бита в aPosition
th (3-й) позиции бита: aValue = 01101001 & 10000111 = 00000001
.
aValue |= (aData & datamask) << aPosition;
теперь копирует aLength
(4) крайних правых бита aData
в aPosition
th (3-ю) битовую позицию в aValue
: aValue = 00000001 | 00110000 = 00110001
.
То, что делает эта функция, - это замена aLength
битов в aPosition
битовой позиции в aValue
на aLength
крайних правых битов в aData
.