Я строю класс BigInt с нуля в C++, но что-то меня раздражает: мой XOR работает неправильно, и я понятия не имею, почему. Я надеялся, что кто-нибудь сможет просветить меня. Ниже приведен минимальный рабочий пример:
class BigInt
{
private:
bool pos;
int size; // Number of binary digits to use
short compare(BigInt input);
public:
BigInt(long long input, int inSize) { pos = true; size = inSize; }
};
short BigInt::compare(BigInt input)
{
// Partial compare function for minimal working example
// Return:
// 1: (*this) > input
// 0: (*this) == input
// -1: (*this) < input
string a = (*this).toDecimal(), b = input.toDecimal();
bool c = (*this).size > input.size, d = (*this).pos ^ input.pos;
bool thispos = (*this).pos, inpos = input.pos;
bool xorpos = (thispos != inpos);
bool x = true, y = true;
bool z = x ^ y;
if ((*this).size > input.size || (*this).pos != input.pos)
return 1 - ((*this).pos ? 0 : 2);
else if ((*this).size < input.size)
return -1 + ((*this).pos ? 0 : 2);
return 0;
}
У меня есть точка останова при первом утверждении if. Ниже приведен список моих наблюдателей.
thispos true bool
inpos true bool
xorpos true bool
x true bool
y true bool
z false bool
Кто-нибудь знает, что происходит? Я бы предпочел избегать компиляции моего оператора if. У меня никогда не было проблемы с таким простым использованием моего XOR.
Насколько я могу судить, не должно быть ничего плохого, но есть что-то об этих ценностях, которые просто не будут оценивать то, как они ожидаются.
Изменение: Изменен код для минимального рабочего примера.
Ну, хотя ^
является побитовым оператором xor, ваши инициализации
bool thispos = (*this).pos, inpos = input.pos;
необходимы для преобразования значений источника в тип bool
. Значения типа bool
гарантированно действуют как 0
или 1
в арифметических контекстах. Это значит, что
bool xorpos = thispos ^ inpos;
требуется инициализировать xorpos
с false
если оба thispos
и inpos
были первоначально true
.
Если вы наблюдаете различное поведение, это может быть ошибкой в вашем компиляторе. Integral-to bool
преобразование может быть реализовано неправильно или что - то подобное.
Другая возможность заключается в том, что кто-то "переопределил" ключевое слово bool
, делая что-то вроде
#define bool unsigned char
Это отключит правильную семантику bool
в первой паре инициализаций и приведет к поразрядному характеру ^
чтобы повлиять на результат.
1
и 2
оба имеют значение true
в логическом контексте, но 1^2=3
что также верно в побитовом смысле, но должно быть false в смысле логического xor.
Почему бы просто не сделать x != y
? Это более соответствует вашим типам.
(*this).
... Я предполагаю, что это не то, что вы хотите. Простоsize
илиpos
. Если вы должны сослаться наthis
, это будетthis->