**unsigned_int<>** supports `unsigned`'s bitwise operators `&` (`bitand`),
`|` (`bitor`), `^` (`bitxor`) and unary `~` (`compl`).

The non-assigment binary operators ( `&`, `|`, `^` ) return and calculate
with the promoted type of both arguments.

The assignment binary operators simply work on the result.

`operator ~ ()` returns a complemented copy of its operand.

unsigned_int< 128 > a, b, d; unsigned u; unsigned_int< 128 > aAndB, aOrB, aXorB; bitwise_init( a, b, aAndB, aOrB, aXorB ); CHECK( (a & b) == aAndB ); CHECK( (a | b) == aOrB ); CHECK( (a ^ b) == aXorB ); d = a; a &= b; CHECK( a == aAndB ); a = d; a |= b; CHECK( a == aOrB ); a = d; a ^= b; CHECK( a == aXorB ); a = d; u = b; CHECK( (a & u) == (unsigned)aAndB ); CHECK( (a | u) != (unsigned)aOrB && unsigned(a | u) == (unsigned)aOrB ); CHECK( (a ^ u) != (unsigned)aXorB && unsigned(a ^ u) == (unsigned)aXorB ); CHECK( (u & a) == (unsigned)aAndB ); CHECK( (u | a) != (unsigned)aOrB && unsigned(a | u) == (unsigned)aOrB ); CHECK( (u ^ a) != (unsigned)aXorB && unsigned(a ^ u) == (unsigned)aXorB ); d = a; a &= u; CHECK( a == (unsigned)aAndB ); a = d; a |= u; CHECK( a != (unsigned)aOrB && (unsigned)a == (unsigned)aOrB ); a = d; a ^= u; CHECK( a != (unsigned)aXorB && (unsigned)a == (unsigned)aXorB ); a = d; u = d; u &= b; CHECK( u == (unsigned)aAndB ); u = d; u |= b; CHECK( u == (unsigned)aOrB ); u = d; u ^= b; CHECK( u == (unsigned)aXorB ); /* check op ~ too */ CHECK( ~a == ~a && !(~a ^ ~a) ); a = -1; CHECK( !~a );

Test Result: gcc34 *Passed*, msvc80 *Passed*, msvc71 *Passed*

Output

Ok