Я пишу класс с фиксированной точкой, но натолкнулся на некоторую загадку ... Умножение, деление частей, я не знаю, как имитировать. Я сделал очень грубый удар по оператору подразделения, но я уверен, что это неправильно. Вот как это выглядит до сих пор:
class Fixed
{
Fixed(short int _value, short int _part) :
value(long(_value + (_part >> 8))), part(long(_part & 0x0000FFFF)) {};
...
inline Fixed operator -() const // example of some of the bitwise it's doing
{
return Fixed(-value - 1, (~part)&0x0000FFFF);
};
...
inline Fixed operator / (const Fixed & arg) const // example of how I'm probably doing it wrong
{
long int tempInt = value<<8 | part;
long int tempPart = tempInt;
tempInt /= arg.value<<8 | arg.part;
tempPart %= arg.value<<8 | arg.part;
return Fixed(tempInt, tempPart);
};
long int value, part; // members
};
Я ... я не очень хороший программист, хаха!
'Часть' класса имеет ширину 16 бит (но она выражается как длинный 32 бит, так как я предполагаю, что потребуется место для возможных переполнений, прежде чем они будут исправлены), и то же самое относится и к 'значению', которое является целочисленной частью , Когда «часть» переходит 0xFFFF в одной из своих операций, старшие 16 бит добавляются к «значению», а затем часть маскируется, так что остаются только самые младшие 16 бит. Это сделано в списке инициализации.
Ненавижу спрашивать, но если кто-нибудь узнает, где я могу найти документацию для чего-то подобного, или даже просто "трюк" или как сделать эти два оператора, я был бы очень рад за это! Я тупица, когда дело доходит до математики, и я знаю, что кто-то должен был сделать / спросить это раньше, но поиск в Google на этот раз не привел меня в землю обетованную ...