XOR运算符无法在C ++中正确评估

时间:2014-01-28 23:00:29

标签: c++ xor

我正在用C ++从头开始构建一个BigInt类,但有些事情让我感到疯狂:我的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的这种简单使用一直没有问题。

据我所知,应该没有错,但是这些价值的某些东西不能评估它们的预期方式。

编辑:将代码更改为最小的工作示例。

2 个答案:

答案 0 :(得分:6)

好吧,即使^是按位xor运算符,也是初始化

bool thispos = (*this).pos, inpos = input.pos;

需要将源值转换为bool类型。 bool类型的值保证在算术上下文中充当01。这意味着

bool xorpos = thispos ^ inpos;
如果xorposfalse最初都是thispos,则

需要使用inpos初始化true

如果您观察到不同的行为,则可能是编译器中的错误。积分到bool转换可能会错误地执行或类似。

另一个机会是有人通过执行类似

的操作“重新定义”bool关键字
#define bool unsigned char

这将禁用第一对初始化中的正确bool语义,并导致^的按位性质影响结果。

答案 1 :(得分:3)

为什么不简单地x != y?这也与您的类型更加一致。