Чем отличаются записи? Получается разный результат при одинаковых входных условиях

Чем отличаются записи? Я хотел понять что происходит внутри кода. Разбил его на куски. В итоге у меня получается разный результат при одинаковых входных условиях:

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); //обрезаем переменную под длину Т-типа
}

Ответы (0 шт):