Вообще говоря, должно работать что-то вроде следующего (что не обязательно является допустимым C #):
int readValue(int sourceBits, int dataOffset, int dataLength) {
unsigned int mask = pow(2, dataLength) - 1;
return (sourceBits >> dataOffset) & mask;
}
Обратите внимание, что смещение данных обрабатывается как начиная с самого правого бита в поле, причем значения растутналево.Чтобы использовать смещения, которые начинаются слева и растут вправо, сделайте что-то вроде:
int readValue(int sourceBits, int dataOffset, int dataLength) {
unsigned int mask = pow(2, dataLength) - 1;
return (sourceBits >> (32 - (dataOffset - dataLength))) & mask;
}