Оператор XOR неправильно вычисляется в C ++

0

Я строю класс 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.

Насколько я могу судить, не должно быть ничего плохого, но есть что-то об этих ценностях, которые просто не будут оценивать то, как они ожидаются.

Изменение: Изменен код для минимального рабочего примера.

  • 0
    Каков ваш выход и ожидаемый результат?
  • 1
    (*this). ... Я предполагаю, что это не то, что вы хотите. Просто size или pos . Если вы должны сослаться на this , это будет this->
Показать ещё 9 комментариев
Теги:
xor

2 ответа

6

Ну, хотя ^ является побитовым оператором 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 в первой паре инициализаций и приведет к поразрядному характеру ^ чтобы повлиять на результат.

  • 0
    +1 Это хорошая гипотеза, объясняющая наблюдаемое поведение ОП. Например, 1 и 2 оба имеют значение true в логическом контексте, но 1^2=3 что также верно в побитовом смысле, но должно быть false в смысле логического xor.
  • 0
    BigInt.pos - тип bool, поэтому я не думаю, что это проблема, и ключевое слово никогда не переопределялось. Предполагая, что я вас правильно понимаю, это не учитывает странное поведение.
3

Почему бы просто не сделать x != y? Это более соответствует вашим типам.

  • 0
    С тех пор я изменил это на то, чтобы я мог продолжать работать, но я все еще хотел бы знать, что происходит (x ^ y).
  • 0
    Ну, я должен был попытаться скомпилировать сразу после этого изменения. Оказывается, что (thispos! = Inpos) все еще оценивает неправильно. Что на земле происходит?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню