diff --git a/verinum.cc b/verinum.cc index 84debdb1b..a463cdb63 100644 --- a/verinum.cc +++ b/verinum.cc @@ -997,9 +997,9 @@ verinum::V operator & (verinum::V l, verinum::V r) verinum::V operator ^ (verinum::V l, verinum::V r) { if (l == verinum::V0) - return r; + return bit4_z2x(r); if (r == verinum::V0) - return l; + return bit4_z2x(l); if ((l == verinum::V1) && (r == verinum::V1)) return verinum::V0; diff --git a/verinum.h b/verinum.h index aa92206b0..39caae4e8 100644 --- a/verinum.h +++ b/verinum.h @@ -113,6 +113,9 @@ extern verinum trim_vnum(const verinum&); extern std::ostream& operator<< (std::ostream&, const verinum&); extern std::ostream& operator<< (std::ostream&, verinum::V); +inline verinum::V bit4_z2x(verinum::V bit) +{ return bit<2? bit : verinum::Vx; /* Relies on V0 and V1 being <2 */} + extern verinum::V operator ~ (verinum::V l); extern verinum::V operator | (verinum::V l, verinum::V r); extern verinum::V operator & (verinum::V l, verinum::V r);