我正在用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的这种简单使用一直没有问题。
据我所知,应该没有错,但是这些价值的某些东西不能评估它们的预期方式。
编辑:将代码更改为最小的工作示例。
答案 0 :(得分:6)
好吧,即使^
是按位xor运算符,也是初始化
bool thispos = (*this).pos, inpos = input.pos;
需要将源值转换为bool
类型。 bool
类型的值保证在算术上下文中充当0
或1
。这意味着
bool xorpos = thispos ^ inpos;
如果xorpos
和false
最初都是thispos
,则需要使用inpos
初始化true
。
如果您观察到不同的行为,则可能是编译器中的错误。积分到bool
转换可能会错误地执行或类似。
另一个机会是有人通过执行类似
的操作“重新定义”bool
关键字
#define bool unsigned char
这将禁用第一对初始化中的正确bool
语义,并导致^
的按位性质影响结果。
答案 1 :(得分:3)
为什么不简单地x != y
?这也与您的类型更加一致。