Чем отличаются записи? Получается разный результат при одинаковых входных условиях
Чем отличаются записи? Я хотел понять что происходит внутри кода. Разбил его на куски. В итоге у меня получается разный результат при одинаковых входных условиях:
public BitReader(byte[] data, int offset)
{
Data = data;
Offset = offset;
}
public T Read<T>(int numBits) where T : unmanaged
{
ulong result = Unsafe.As<byte, ulong>(ref Data[Offset + (Position >> 3)]) << (64 - numBits - (Position & 7)) >> (64 - numBits);
Position += numBits;
return Unsafe.As<ulong, T>(ref result);
}
public T Read<T>(int numBits) where T : unmanaged
{
byte temp1 = Data[Offset + (Position >> 3)]; //берем ссылку на первый элемент
ulong temp2 = Unsafe.As<byte, ulong>(ref temp1); //берем массив байтов 8шт (кстати что будет если ссылка будет на предпоследние 7 байтов?
ulong temp3 = temp2 << (64 - numBits - (Position & 7)); //откидываем лишние биты (делаем кратным 1 байту)
ulong result = temp3 >> (64 - numBits);//смещаем информацию на нулевой бит
Position += numBits;
return Unsafe.As<ulong, T>(ref result); //обрезаем переменную под длину Т-типа
}