[m-rev.] for review: add left and right shifts for uints

Julien Fischer jfischer at opturion.com
Sun May 7 13:47:06 AEST 2017


Hi,

The absence of any review comments I will go ahead and commit this.
I will deal with any review comments post-commit.

Julien.
≈

On Thu, 4 May 2017, Julien Fischer wrote:

>
> For review by anyone.
>
> This adds left and right shifts for uints.  As proposed on the mailing list
> these operations throw an exception if the second operand is not in the
> range [0, bits_per_uint).  (I assume everyone is alright with this
> behaviour since nobody objected when Zoltan suggested it.)  I will make
> a corresponding change to the int module separately.
>
> --------------------------------------
>
> Implement checked shifts for uints.
>
> library/uint.m:
>     Add checked left and right shift operations on uints.
>
> tests/hard_coded/Mmakefile:
> tests/hard_coded/uint_bitwise.m:
>     Test bitwise operators on uints.
>
> tests/hard_coded/uint_bitwise.exp:
>     Expected output for 64-bit machines.
>
> tests/hard_coded/uint_bitwise.exp2:
>     Expected output for 32-bit machines (as well as the
>     C# and Java grades).
>
> Julien.
>
> diff --git a/library/uint.m b/library/uint.m
> index 89ae643f6..f757cd78e 100644
> --- a/library/uint.m
> +++ b/library/uint.m
> @@ -81,8 +81,30 @@
>
> :- func unchecked_rem(uint::in, uint::in) = (uint::uo) is det.
>
> +    % Left shift.
> +    % X << Y returns X "left shifted" by Y bits.
> +    % The bit positions vacated by the shift are filled by zeros.
> +    % Throws an exception if Y is not in [0, bits_per_uint).
> +    %
> +:- func (uint::in) << (int::in) = (uint::uo) is det.
> +
> +    % unchecked_lift_shift(X, Y) is the same as X << Y except that the
> +    % behaviour is undefined if Y is not in [0, bits_per_uint).
> +    % It will typically be be implemented more efficiently than X << Y.
> +    %
> :- func unchecked_left_shift(uint::in, int::in) = (uint::uo) is det.
>
> +    % Right shift.
> +    % X >> Y returns X "right shifted" by Y bits.
> +    % The bit positions vacated by the shift are filled by zeros.
> +    % Throws an exception if Y is not in [0, bits_per_uint).
> +    %
> +:- func (uint::in) >> (int::in) = (uint::uo) is det.
> +
> +    % unchecked_right_shift(X, Y) is the same as X >> Y except that the
> +    % behaviour is undefined if Y is not in [0, bits_per_uint).
> +    % It will typically be implemented more efficiently than X >> Y.
> +    %
> :- func unchecked_right_shift(uint::in, int::in) = (uint::uo) is det.
>
>     % even(X) is equivalent to (X mod 2 = 0).
> @@ -126,6 +148,8 @@
>
> :- implementation.
>
> +:- import_module exception.
> +:- import_module math.
> :- import_module require.
> :- import_module string.
>
> @@ -220,6 +244,24 @@ cast_to_int(_) = _ :-
>
> %---------------------------------------------------------------------------%
>
> +X << Y = Result :-
> +    ( if cast_from_int(Y) < cast_from_int(bits_per_uint) then
> +        Result = unchecked_left_shift(X, Y)
> +    else
> +        Msg = "uint.(<<): second operand is out of range",
> +        throw(math.domain_error(Msg))
> +    ).
> +
> +X >> Y = Result :-
> +    ( if cast_from_int(Y) < cast_from_int(bits_per_uint) then
> +        Result = unchecked_right_shift(X, Y)
> +    else
> +        Msg = "uint.(>>): second operand is out of range",
> +        throw(math.domain_error(Msg))
> +    ).
> +
> +%---------------------------------------------------------------------------%
> +
> max(X, Y) =
>     ( if X > Y then X else Y ).
>
> diff --git a/tests/hard_coded/Mmakefile b/tests/hard_coded/Mmakefile
> index e611975b9..5643d7cde 100644
> --- a/tests/hard_coded/Mmakefile
> +++ b/tests/hard_coded/Mmakefile
> @@ -637,6 +637,7 @@ ifeq "$(findstring profdeep,$(GRADE))" ""
> 		try_syntax_6 \
> 		try_syntax_7 \
> 		uint_arith \
> +		uint_bitwise \
> 		user_defined_equality \
> 		version_array_test \
> 		version_hash_table_delete \
> diff --git a/tests/hard_coded/uint_bitwise.exp 
> b/tests/hard_coded/uint_bitwise.exp
> index e69de29bb..38e447d98 100644
> --- a/tests/hard_coded/uint_bitwise.exp
> +++ b/tests/hard_coded/uint_bitwise.exp
> @@ -0,0 +1,325 @@
> +*** Test unary operation '\' ***
> +
> +\ 0000000000000000000000000000000000000000000000000000000000000000 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +\ 0000000000000000000000000000000000000000000000000000000000000001 = 
> 1111111111111111111111111111111111111111111111111111111111111110
> +\ 0000000000000000000000000000000000000000000000000000000000000010 = 
> 1111111111111111111111111111111111111111111111111111111111111101
> +\ 0000000000000000000000000000000000000000000000000000000000001000 = 
> 1111111111111111111111111111111111111111111111111111111111110111
> +\ 0000000000000000000000000000000000000000000000000000000000001010 = 
> 1111111111111111111111111111111111111111111111111111111111110101
> +\ 0000000000000000000000000000000000000000000000000000000000010000 = 
> 1111111111111111111111111111111111111111111111111111111111101111
> +\ 1111111111111111111111111111111111111111111111111111111111111111 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +
> +*** Test binary operation '/\' ***
> +
> +0000000000000000000000000000000000000000000000000000000000000000 /\ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 /\ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 /\ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 /\ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 /\ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 /\ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 /\ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 /\ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 /\ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000000001 /\ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 /\ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 /\ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 /\ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 /\ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000000010 /\ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 /\ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 /\ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000000010 /\ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 /\ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000000010 /\ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 /\ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000001000 /\ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 /\ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 /\ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 /\ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000001000 /\ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000001000 /\ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 /\ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000001010 /\ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 /\ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 /\ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000001010 /\ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000001010 /\ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001010 /\ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 /\ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000010000 /\ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 /\ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 /\ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 /\ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 /\ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 /\ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000010000 /\ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +1111111111111111111111111111111111111111111111111111111111111111 /\ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +1111111111111111111111111111111111111111111111111111111111111111 /\ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +1111111111111111111111111111111111111111111111111111111111111111 /\ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +1111111111111111111111111111111111111111111111111111111111111111 /\ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +1111111111111111111111111111111111111111111111111111111111111111 /\ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +1111111111111111111111111111111111111111111111111111111111111111 /\ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +1111111111111111111111111111111111111111111111111111111111111111 /\ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +
> +*** Test binary operation '\/' ***
> +
> +0000000000000000000000000000000000000000000000000000000000000000 \/ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 \/ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000000000 \/ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000000000 \/ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000000000 \/ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000000000 \/ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000000000 \/ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +0000000000000000000000000000000000000000000000000000000000000001 \/ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000000001 \/ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000000001 \/ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000011
> +0000000000000000000000000000000000000000000000000000000000000001 \/ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001001
> +0000000000000000000000000000000000000000000000000000000000000001 \/ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001011
> +0000000000000000000000000000000000000000000000000000000000000001 \/ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000010001
> +0000000000000000000000000000000000000000000000000000000000000001 \/ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +0000000000000000000000000000000000000000000000000000000000000010 \/ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000000010 \/ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000011
> +0000000000000000000000000000000000000000000000000000000000000010 \/ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000000010 \/ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000000010 \/ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000000010 \/ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000010010
> +0000000000000000000000000000000000000000000000000000000000000010 \/ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +0000000000000000000000000000000000000000000000000000000000001000 \/ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000001000 \/ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000001001
> +0000000000000000000000000000000000000000000000000000000000001000 \/ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001000 \/ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000001000 \/ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001000 \/ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000011000
> +0000000000000000000000000000000000000000000000000000000000001000 \/ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +0000000000000000000000000000000000000000000000000000000000001010 \/ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001010 \/ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000001011
> +0000000000000000000000000000000000000000000000000000000000001010 \/ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001010 \/ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001010 \/ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001010 \/ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000011010
> +0000000000000000000000000000000000000000000000000000000000001010 \/ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +0000000000000000000000000000000000000000000000000000000000010000 \/ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000010000 \/ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000010001
> +0000000000000000000000000000000000000000000000000000000000010000 \/ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000010010
> +0000000000000000000000000000000000000000000000000000000000010000 \/ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000011000
> +0000000000000000000000000000000000000000000000000000000000010000 \/ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000011010
> +0000000000000000000000000000000000000000000000000000000000010000 \/ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000010000 \/ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 \/ 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 \/ 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 \/ 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 \/ 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 \/ 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 \/ 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 \/ 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +
> +*** Test binary operation 'xor' ***
> +
> +0000000000000000000000000000000000000000000000000000000000000000 xor 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 xor 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000000000 xor 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000000000 xor 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000000000 xor 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000000000 xor 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000000000 xor 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +0000000000000000000000000000000000000000000000000000000000000001 xor 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000000001 xor 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 xor 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000011
> +0000000000000000000000000000000000000000000000000000000000000001 xor 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001001
> +0000000000000000000000000000000000000000000000000000000000000001 xor 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001011
> +0000000000000000000000000000000000000000000000000000000000000001 xor 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000010001
> +0000000000000000000000000000000000000000000000000000000000000001 xor 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111110
> +0000000000000000000000000000000000000000000000000000000000000010 xor 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000000010 xor 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000000011
> +0000000000000000000000000000000000000000000000000000000000000010 xor 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 xor 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000000010 xor 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000000010 xor 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000010010
> +0000000000000000000000000000000000000000000000000000000000000010 xor 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111111101
> +0000000000000000000000000000000000000000000000000000000000001000 xor 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000001000 xor 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000001001
> +0000000000000000000000000000000000000000000000000000000000001000 xor 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001000 xor 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 xor 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000001000 xor 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000011000
> +0000000000000000000000000000000000000000000000000000000000001000 xor 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111110111
> +0000000000000000000000000000000000000000000000000000000000001010 xor 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001010 xor 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000001011
> +0000000000000000000000000000000000000000000000000000000000001010 xor 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000001010 xor 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000001010 xor 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 xor 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000011010
> +0000000000000000000000000000000000000000000000000000000000001010 xor 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111110101
> +0000000000000000000000000000000000000000000000000000000000010000 xor 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000010000 xor 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 0000000000000000000000000000000000000000000000000000000000010001
> +0000000000000000000000000000000000000000000000000000000000010000 xor 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 0000000000000000000000000000000000000000000000000000000000010010
> +0000000000000000000000000000000000000000000000000000000000010000 xor 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 0000000000000000000000000000000000000000000000000000000000011000
> +0000000000000000000000000000000000000000000000000000000000010000 xor 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 0000000000000000000000000000000000000000000000000000000000011010
> +0000000000000000000000000000000000000000000000000000000000010000 xor 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 xor 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 1111111111111111111111111111111111111111111111111111111111101111
> +1111111111111111111111111111111111111111111111111111111111111111 xor 
> 0000000000000000000000000000000000000000000000000000000000000000 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 xor 
> 0000000000000000000000000000000000000000000000000000000000000001 = 
> 1111111111111111111111111111111111111111111111111111111111111110
> +1111111111111111111111111111111111111111111111111111111111111111 xor 
> 0000000000000000000000000000000000000000000000000000000000000010 = 
> 1111111111111111111111111111111111111111111111111111111111111101
> +1111111111111111111111111111111111111111111111111111111111111111 xor 
> 0000000000000000000000000000000000000000000000000000000000001000 = 
> 1111111111111111111111111111111111111111111111111111111111110111
> +1111111111111111111111111111111111111111111111111111111111111111 xor 
> 0000000000000000000000000000000000000000000000000000000000001010 = 
> 1111111111111111111111111111111111111111111111111111111111110101
> +1111111111111111111111111111111111111111111111111111111111111111 xor 
> 0000000000000000000000000000000000000000000000000000000000010000 = 
> 1111111111111111111111111111111111111111111111111111111111101111
> +1111111111111111111111111111111111111111111111111111111111111111 xor 
> 1111111111111111111111111111111111111111111111111111111111111111 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +
> +*** Test binary operation '>>' ***
> +
> +0000000000000000000000000000000000000000000000000000000000000000 >> -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000000000 >> 0 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 >> 1 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 >> 2 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 >> 3 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 >> 4 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 >> 8 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 >> 16 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 >> 24 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 >> 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 >> 64 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000000001 >> -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000000001 >> 0 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000000001 >> 1 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 >> 2 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 >> 3 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 >> 4 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 >> 8 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 >> 16 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 >> 24 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 >> 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 >> 64 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000000010 >> -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000000010 >> 0 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000000010 >> 1 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000000010 >> 2 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 >> 3 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 >> 4 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 >> 8 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 >> 16 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 >> 24 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 >> 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 >> 64 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000001000 >> -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000001000 >> 0 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000001000 >> 1 = 
> 0000000000000000000000000000000000000000000000000000000000000100
> +0000000000000000000000000000000000000000000000000000000000001000 >> 2 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000001000 >> 3 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000001000 >> 4 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 >> 8 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 >> 16 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 >> 24 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 >> 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 >> 64 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000001010 >> -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000001010 >> 0 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001010 >> 1 = 
> 0000000000000000000000000000000000000000000000000000000000000101
> +0000000000000000000000000000000000000000000000000000000000001010 >> 2 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000001010 >> 3 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000001010 >> 4 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 >> 8 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 >> 16 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 >> 24 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 >> 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 >> 64 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000010000 >> -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000010000 >> 0 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000010000 >> 1 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000010000 >> 2 = 
> 0000000000000000000000000000000000000000000000000000000000000100
> +0000000000000000000000000000000000000000000000000000000000010000 >> 3 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000010000 >> 4 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000010000 >> 8 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 >> 16 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 >> 24 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 >> 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 >> 64 = 
> <<exception>>
> +1111111111111111111111111111111111111111111111111111111111111111 >> -1 = 
> <<exception>>
> +1111111111111111111111111111111111111111111111111111111111111111 >> 0 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 >> 1 = 
> 0111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 >> 2 = 
> 0011111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 >> 3 = 
> 0001111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 >> 4 = 
> 0000111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 >> 8 = 
> 0000000011111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 >> 16 = 
> 0000000000000000111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 >> 24 = 
> 0000000000000000000000001111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 >> 63 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +1111111111111111111111111111111111111111111111111111111111111111 >> 64 = 
> <<exception>>
> +
> +*** Test binary operation '<<' ***
> +
> +0000000000000000000000000000000000000000000000000000000000000000 << -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000000000 << 0 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 << 1 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 << 2 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 << 3 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 << 4 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 << 8 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 << 16 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 << 24 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 << 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000000 << 64 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000000001 << -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000000001 << 0 = 
> 0000000000000000000000000000000000000000000000000000000000000001
> +0000000000000000000000000000000000000000000000000000000000000001 << 1 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000000001 << 2 = 
> 0000000000000000000000000000000000000000000000000000000000000100
> +0000000000000000000000000000000000000000000000000000000000000001 << 3 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000000001 << 4 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000000001 << 8 = 
> 0000000000000000000000000000000000000000000000000000000100000000
> +0000000000000000000000000000000000000000000000000000000000000001 << 16 = 
> 0000000000000000000000000000000000000000000000010000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 << 24 = 
> 0000000000000000000000000000000000000001000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 << 63 = 
> 1000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000001 << 64 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000000010 << -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000000010 << 0 = 
> 0000000000000000000000000000000000000000000000000000000000000010
> +0000000000000000000000000000000000000000000000000000000000000010 << 1 = 
> 0000000000000000000000000000000000000000000000000000000000000100
> +0000000000000000000000000000000000000000000000000000000000000010 << 2 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000000010 << 3 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000000010 << 4 = 
> 0000000000000000000000000000000000000000000000000000000000100000
> +0000000000000000000000000000000000000000000000000000000000000010 << 8 = 
> 0000000000000000000000000000000000000000000000000000001000000000
> +0000000000000000000000000000000000000000000000000000000000000010 << 16 = 
> 0000000000000000000000000000000000000000000000100000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 << 24 = 
> 0000000000000000000000000000000000000010000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 << 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000000010 << 64 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000001000 << -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000001000 << 0 = 
> 0000000000000000000000000000000000000000000000000000000000001000
> +0000000000000000000000000000000000000000000000000000000000001000 << 1 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000001000 << 2 = 
> 0000000000000000000000000000000000000000000000000000000000100000
> +0000000000000000000000000000000000000000000000000000000000001000 << 3 = 
> 0000000000000000000000000000000000000000000000000000000001000000
> +0000000000000000000000000000000000000000000000000000000000001000 << 4 = 
> 0000000000000000000000000000000000000000000000000000000010000000
> +0000000000000000000000000000000000000000000000000000000000001000 << 8 = 
> 0000000000000000000000000000000000000000000000000000100000000000
> +0000000000000000000000000000000000000000000000000000000000001000 << 16 = 
> 0000000000000000000000000000000000000000000010000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 << 24 = 
> 0000000000000000000000000000000000001000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 << 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001000 << 64 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000001010 << -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000001010 << 0 = 
> 0000000000000000000000000000000000000000000000000000000000001010
> +0000000000000000000000000000000000000000000000000000000000001010 << 1 = 
> 0000000000000000000000000000000000000000000000000000000000010100
> +0000000000000000000000000000000000000000000000000000000000001010 << 2 = 
> 0000000000000000000000000000000000000000000000000000000000101000
> +0000000000000000000000000000000000000000000000000000000000001010 << 3 = 
> 0000000000000000000000000000000000000000000000000000000001010000
> +0000000000000000000000000000000000000000000000000000000000001010 << 4 = 
> 0000000000000000000000000000000000000000000000000000000010100000
> +0000000000000000000000000000000000000000000000000000000000001010 << 8 = 
> 0000000000000000000000000000000000000000000000000000101000000000
> +0000000000000000000000000000000000000000000000000000000000001010 << 16 = 
> 0000000000000000000000000000000000000000000010100000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 << 24 = 
> 0000000000000000000000000000000000001010000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 << 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000001010 << 64 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000010000 << -1 = 
> <<exception>>
> +0000000000000000000000000000000000000000000000000000000000010000 << 0 = 
> 0000000000000000000000000000000000000000000000000000000000010000
> +0000000000000000000000000000000000000000000000000000000000010000 << 1 = 
> 0000000000000000000000000000000000000000000000000000000000100000
> +0000000000000000000000000000000000000000000000000000000000010000 << 2 = 
> 0000000000000000000000000000000000000000000000000000000001000000
> +0000000000000000000000000000000000000000000000000000000000010000 << 3 = 
> 0000000000000000000000000000000000000000000000000000000010000000
> +0000000000000000000000000000000000000000000000000000000000010000 << 4 = 
> 0000000000000000000000000000000000000000000000000000000100000000
> +0000000000000000000000000000000000000000000000000000000000010000 << 8 = 
> 0000000000000000000000000000000000000000000000000001000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 << 16 = 
> 0000000000000000000000000000000000000000000100000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 << 24 = 
> 0000000000000000000000000000000000010000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 << 63 = 
> 0000000000000000000000000000000000000000000000000000000000000000
> +0000000000000000000000000000000000000000000000000000000000010000 << 64 = 
> <<exception>>
> +1111111111111111111111111111111111111111111111111111111111111111 << -1 = 
> <<exception>>
> +1111111111111111111111111111111111111111111111111111111111111111 << 0 = 
> 1111111111111111111111111111111111111111111111111111111111111111
> +1111111111111111111111111111111111111111111111111111111111111111 << 1 = 
> 1111111111111111111111111111111111111111111111111111111111111110
> +1111111111111111111111111111111111111111111111111111111111111111 << 2 = 
> 1111111111111111111111111111111111111111111111111111111111111100
> +1111111111111111111111111111111111111111111111111111111111111111 << 3 = 
> 1111111111111111111111111111111111111111111111111111111111111000
> +1111111111111111111111111111111111111111111111111111111111111111 << 4 = 
> 1111111111111111111111111111111111111111111111111111111111110000
> +1111111111111111111111111111111111111111111111111111111111111111 << 8 = 
> 1111111111111111111111111111111111111111111111111111111100000000
> +1111111111111111111111111111111111111111111111111111111111111111 << 16 = 
> 1111111111111111111111111111111111111111111111110000000000000000
> +1111111111111111111111111111111111111111111111111111111111111111 << 24 = 
> 1111111111111111111111111111111111111111000000000000000000000000
> +1111111111111111111111111111111111111111111111111111111111111111 << 63 = 
> 1000000000000000000000000000000000000000000000000000000000000000
> +1111111111111111111111111111111111111111111111111111111111111111 << 64 = 
> <<exception>>
> diff --git a/tests/hard_coded/uint_bitwise.exp2 
> b/tests/hard_coded/uint_bitwise.exp2
> index e69de29bb..eda7822fd 100644
> --- a/tests/hard_coded/uint_bitwise.exp2
> +++ b/tests/hard_coded/uint_bitwise.exp2
> @@ -0,0 +1,325 @@
> +*** Test unary operation '\' ***
> +
> +\ 00000000000000000000000000000000 = 11111111111111111111111111111111
> +\ 00000000000000000000000000000001 = 11111111111111111111111111111110
> +\ 00000000000000000000000000000010 = 11111111111111111111111111111101
> +\ 00000000000000000000000000001000 = 11111111111111111111111111110111
> +\ 00000000000000000000000000001010 = 11111111111111111111111111110101
> +\ 00000000000000000000000000010000 = 11111111111111111111111111101111
> +\ 11111111111111111111111111111111 = 00000000000000000000000000000000
> +
> +*** Test binary operation '/\' ***
> +
> +00000000000000000000000000000000 /\ 00000000000000000000000000000000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000000 /\ 00000000000000000000000000000001 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000000 /\ 00000000000000000000000000000010 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000000 /\ 00000000000000000000000000001000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000000 /\ 00000000000000000000000000001010 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000000 /\ 00000000000000000000000000010000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000000 /\ 11111111111111111111111111111111 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000001 /\ 00000000000000000000000000000000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000001 /\ 00000000000000000000000000000001 = 
> 00000000000000000000000000000001
> +00000000000000000000000000000001 /\ 00000000000000000000000000000010 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000001 /\ 00000000000000000000000000001000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000001 /\ 00000000000000000000000000001010 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000001 /\ 00000000000000000000000000010000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000001 /\ 11111111111111111111111111111111 = 
> 00000000000000000000000000000001
> +00000000000000000000000000000010 /\ 00000000000000000000000000000000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000010 /\ 00000000000000000000000000000001 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000010 /\ 00000000000000000000000000000010 = 
> 00000000000000000000000000000010
> +00000000000000000000000000000010 /\ 00000000000000000000000000001000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000010 /\ 00000000000000000000000000001010 = 
> 00000000000000000000000000000010
> +00000000000000000000000000000010 /\ 00000000000000000000000000010000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000010 /\ 11111111111111111111111111111111 = 
> 00000000000000000000000000000010
> +00000000000000000000000000001000 /\ 00000000000000000000000000000000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000001000 /\ 00000000000000000000000000000001 = 
> 00000000000000000000000000000000
> +00000000000000000000000000001000 /\ 00000000000000000000000000000010 = 
> 00000000000000000000000000000000
> +00000000000000000000000000001000 /\ 00000000000000000000000000001000 = 
> 00000000000000000000000000001000
> +00000000000000000000000000001000 /\ 00000000000000000000000000001010 = 
> 00000000000000000000000000001000
> +00000000000000000000000000001000 /\ 00000000000000000000000000010000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000001000 /\ 11111111111111111111111111111111 = 
> 00000000000000000000000000001000
> +00000000000000000000000000001010 /\ 00000000000000000000000000000000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000001010 /\ 00000000000000000000000000000001 = 
> 00000000000000000000000000000000
> +00000000000000000000000000001010 /\ 00000000000000000000000000000010 = 
> 00000000000000000000000000000010
> +00000000000000000000000000001010 /\ 00000000000000000000000000001000 = 
> 00000000000000000000000000001000
> +00000000000000000000000000001010 /\ 00000000000000000000000000001010 = 
> 00000000000000000000000000001010
> +00000000000000000000000000001010 /\ 00000000000000000000000000010000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000001010 /\ 11111111111111111111111111111111 = 
> 00000000000000000000000000001010
> +00000000000000000000000000010000 /\ 00000000000000000000000000000000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000010000 /\ 00000000000000000000000000000001 = 
> 00000000000000000000000000000000
> +00000000000000000000000000010000 /\ 00000000000000000000000000000010 = 
> 00000000000000000000000000000000
> +00000000000000000000000000010000 /\ 00000000000000000000000000001000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000010000 /\ 00000000000000000000000000001010 = 
> 00000000000000000000000000000000
> +00000000000000000000000000010000 /\ 00000000000000000000000000010000 = 
> 00000000000000000000000000010000
> +00000000000000000000000000010000 /\ 11111111111111111111111111111111 = 
> 00000000000000000000000000010000
> +11111111111111111111111111111111 /\ 00000000000000000000000000000000 = 
> 00000000000000000000000000000000
> +11111111111111111111111111111111 /\ 00000000000000000000000000000001 = 
> 00000000000000000000000000000001
> +11111111111111111111111111111111 /\ 00000000000000000000000000000010 = 
> 00000000000000000000000000000010
> +11111111111111111111111111111111 /\ 00000000000000000000000000001000 = 
> 00000000000000000000000000001000
> +11111111111111111111111111111111 /\ 00000000000000000000000000001010 = 
> 00000000000000000000000000001010
> +11111111111111111111111111111111 /\ 00000000000000000000000000010000 = 
> 00000000000000000000000000010000
> +11111111111111111111111111111111 /\ 11111111111111111111111111111111 = 
> 11111111111111111111111111111111
> +
> +*** Test binary operation '\/' ***
> +
> +00000000000000000000000000000000 \/ 00000000000000000000000000000000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000000 \/ 00000000000000000000000000000001 = 
> 00000000000000000000000000000001
> +00000000000000000000000000000000 \/ 00000000000000000000000000000010 = 
> 00000000000000000000000000000010
> +00000000000000000000000000000000 \/ 00000000000000000000000000001000 = 
> 00000000000000000000000000001000
> +00000000000000000000000000000000 \/ 00000000000000000000000000001010 = 
> 00000000000000000000000000001010
> +00000000000000000000000000000000 \/ 00000000000000000000000000010000 = 
> 00000000000000000000000000010000
> +00000000000000000000000000000000 \/ 11111111111111111111111111111111 = 
> 11111111111111111111111111111111
> +00000000000000000000000000000001 \/ 00000000000000000000000000000000 = 
> 00000000000000000000000000000001
> +00000000000000000000000000000001 \/ 00000000000000000000000000000001 = 
> 00000000000000000000000000000001
> +00000000000000000000000000000001 \/ 00000000000000000000000000000010 = 
> 00000000000000000000000000000011
> +00000000000000000000000000000001 \/ 00000000000000000000000000001000 = 
> 00000000000000000000000000001001
> +00000000000000000000000000000001 \/ 00000000000000000000000000001010 = 
> 00000000000000000000000000001011
> +00000000000000000000000000000001 \/ 00000000000000000000000000010000 = 
> 00000000000000000000000000010001
> +00000000000000000000000000000001 \/ 11111111111111111111111111111111 = 
> 11111111111111111111111111111111
> +00000000000000000000000000000010 \/ 00000000000000000000000000000000 = 
> 00000000000000000000000000000010
> +00000000000000000000000000000010 \/ 00000000000000000000000000000001 = 
> 00000000000000000000000000000011
> +00000000000000000000000000000010 \/ 00000000000000000000000000000010 = 
> 00000000000000000000000000000010
> +00000000000000000000000000000010 \/ 00000000000000000000000000001000 = 
> 00000000000000000000000000001010
> +00000000000000000000000000000010 \/ 00000000000000000000000000001010 = 
> 00000000000000000000000000001010
> +00000000000000000000000000000010 \/ 00000000000000000000000000010000 = 
> 00000000000000000000000000010010
> +00000000000000000000000000000010 \/ 11111111111111111111111111111111 = 
> 11111111111111111111111111111111
> +00000000000000000000000000001000 \/ 00000000000000000000000000000000 = 
> 00000000000000000000000000001000
> +00000000000000000000000000001000 \/ 00000000000000000000000000000001 = 
> 00000000000000000000000000001001
> +00000000000000000000000000001000 \/ 00000000000000000000000000000010 = 
> 00000000000000000000000000001010
> +00000000000000000000000000001000 \/ 00000000000000000000000000001000 = 
> 00000000000000000000000000001000
> +00000000000000000000000000001000 \/ 00000000000000000000000000001010 = 
> 00000000000000000000000000001010
> +00000000000000000000000000001000 \/ 00000000000000000000000000010000 = 
> 00000000000000000000000000011000
> +00000000000000000000000000001000 \/ 11111111111111111111111111111111 = 
> 11111111111111111111111111111111
> +00000000000000000000000000001010 \/ 00000000000000000000000000000000 = 
> 00000000000000000000000000001010
> +00000000000000000000000000001010 \/ 00000000000000000000000000000001 = 
> 00000000000000000000000000001011
> +00000000000000000000000000001010 \/ 00000000000000000000000000000010 = 
> 00000000000000000000000000001010
> +00000000000000000000000000001010 \/ 00000000000000000000000000001000 = 
> 00000000000000000000000000001010
> +00000000000000000000000000001010 \/ 00000000000000000000000000001010 = 
> 00000000000000000000000000001010
> +00000000000000000000000000001010 \/ 00000000000000000000000000010000 = 
> 00000000000000000000000000011010
> +00000000000000000000000000001010 \/ 11111111111111111111111111111111 = 
> 11111111111111111111111111111111
> +00000000000000000000000000010000 \/ 00000000000000000000000000000000 = 
> 00000000000000000000000000010000
> +00000000000000000000000000010000 \/ 00000000000000000000000000000001 = 
> 00000000000000000000000000010001
> +00000000000000000000000000010000 \/ 00000000000000000000000000000010 = 
> 00000000000000000000000000010010
> +00000000000000000000000000010000 \/ 00000000000000000000000000001000 = 
> 00000000000000000000000000011000
> +00000000000000000000000000010000 \/ 00000000000000000000000000001010 = 
> 00000000000000000000000000011010
> +00000000000000000000000000010000 \/ 00000000000000000000000000010000 = 
> 00000000000000000000000000010000
> +00000000000000000000000000010000 \/ 11111111111111111111111111111111 = 
> 11111111111111111111111111111111
> +11111111111111111111111111111111 \/ 00000000000000000000000000000000 = 
> 11111111111111111111111111111111
> +11111111111111111111111111111111 \/ 00000000000000000000000000000001 = 
> 11111111111111111111111111111111
> +11111111111111111111111111111111 \/ 00000000000000000000000000000010 = 
> 11111111111111111111111111111111
> +11111111111111111111111111111111 \/ 00000000000000000000000000001000 = 
> 11111111111111111111111111111111
> +11111111111111111111111111111111 \/ 00000000000000000000000000001010 = 
> 11111111111111111111111111111111
> +11111111111111111111111111111111 \/ 00000000000000000000000000010000 = 
> 11111111111111111111111111111111
> +11111111111111111111111111111111 \/ 11111111111111111111111111111111 = 
> 11111111111111111111111111111111
> +
> +*** Test binary operation 'xor' ***
> +
> +00000000000000000000000000000000 xor 00000000000000000000000000000000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000000 xor 00000000000000000000000000000001 = 
> 00000000000000000000000000000001
> +00000000000000000000000000000000 xor 00000000000000000000000000000010 = 
> 00000000000000000000000000000010
> +00000000000000000000000000000000 xor 00000000000000000000000000001000 = 
> 00000000000000000000000000001000
> +00000000000000000000000000000000 xor 00000000000000000000000000001010 = 
> 00000000000000000000000000001010
> +00000000000000000000000000000000 xor 00000000000000000000000000010000 = 
> 00000000000000000000000000010000
> +00000000000000000000000000000000 xor 11111111111111111111111111111111 = 
> 11111111111111111111111111111111
> +00000000000000000000000000000001 xor 00000000000000000000000000000000 = 
> 00000000000000000000000000000001
> +00000000000000000000000000000001 xor 00000000000000000000000000000001 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000001 xor 00000000000000000000000000000010 = 
> 00000000000000000000000000000011
> +00000000000000000000000000000001 xor 00000000000000000000000000001000 = 
> 00000000000000000000000000001001
> +00000000000000000000000000000001 xor 00000000000000000000000000001010 = 
> 00000000000000000000000000001011
> +00000000000000000000000000000001 xor 00000000000000000000000000010000 = 
> 00000000000000000000000000010001
> +00000000000000000000000000000001 xor 11111111111111111111111111111111 = 
> 11111111111111111111111111111110
> +00000000000000000000000000000010 xor 00000000000000000000000000000000 = 
> 00000000000000000000000000000010
> +00000000000000000000000000000010 xor 00000000000000000000000000000001 = 
> 00000000000000000000000000000011
> +00000000000000000000000000000010 xor 00000000000000000000000000000010 = 
> 00000000000000000000000000000000
> +00000000000000000000000000000010 xor 00000000000000000000000000001000 = 
> 00000000000000000000000000001010
> +00000000000000000000000000000010 xor 00000000000000000000000000001010 = 
> 00000000000000000000000000001000
> +00000000000000000000000000000010 xor 00000000000000000000000000010000 = 
> 00000000000000000000000000010010
> +00000000000000000000000000000010 xor 11111111111111111111111111111111 = 
> 11111111111111111111111111111101
> +00000000000000000000000000001000 xor 00000000000000000000000000000000 = 
> 00000000000000000000000000001000
> +00000000000000000000000000001000 xor 00000000000000000000000000000001 = 
> 00000000000000000000000000001001
> +00000000000000000000000000001000 xor 00000000000000000000000000000010 = 
> 00000000000000000000000000001010
> +00000000000000000000000000001000 xor 00000000000000000000000000001000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000001000 xor 00000000000000000000000000001010 = 
> 00000000000000000000000000000010
> +00000000000000000000000000001000 xor 00000000000000000000000000010000 = 
> 00000000000000000000000000011000
> +00000000000000000000000000001000 xor 11111111111111111111111111111111 = 
> 11111111111111111111111111110111
> +00000000000000000000000000001010 xor 00000000000000000000000000000000 = 
> 00000000000000000000000000001010
> +00000000000000000000000000001010 xor 00000000000000000000000000000001 = 
> 00000000000000000000000000001011
> +00000000000000000000000000001010 xor 00000000000000000000000000000010 = 
> 00000000000000000000000000001000
> +00000000000000000000000000001010 xor 00000000000000000000000000001000 = 
> 00000000000000000000000000000010
> +00000000000000000000000000001010 xor 00000000000000000000000000001010 = 
> 00000000000000000000000000000000
> +00000000000000000000000000001010 xor 00000000000000000000000000010000 = 
> 00000000000000000000000000011010
> +00000000000000000000000000001010 xor 11111111111111111111111111111111 = 
> 11111111111111111111111111110101
> +00000000000000000000000000010000 xor 00000000000000000000000000000000 = 
> 00000000000000000000000000010000
> +00000000000000000000000000010000 xor 00000000000000000000000000000001 = 
> 00000000000000000000000000010001
> +00000000000000000000000000010000 xor 00000000000000000000000000000010 = 
> 00000000000000000000000000010010
> +00000000000000000000000000010000 xor 00000000000000000000000000001000 = 
> 00000000000000000000000000011000
> +00000000000000000000000000010000 xor 00000000000000000000000000001010 = 
> 00000000000000000000000000011010
> +00000000000000000000000000010000 xor 00000000000000000000000000010000 = 
> 00000000000000000000000000000000
> +00000000000000000000000000010000 xor 11111111111111111111111111111111 = 
> 11111111111111111111111111101111
> +11111111111111111111111111111111 xor 00000000000000000000000000000000 = 
> 11111111111111111111111111111111
> +11111111111111111111111111111111 xor 00000000000000000000000000000001 = 
> 11111111111111111111111111111110
> +11111111111111111111111111111111 xor 00000000000000000000000000000010 = 
> 11111111111111111111111111111101
> +11111111111111111111111111111111 xor 00000000000000000000000000001000 = 
> 11111111111111111111111111110111
> +11111111111111111111111111111111 xor 00000000000000000000000000001010 = 
> 11111111111111111111111111110101
> +11111111111111111111111111111111 xor 00000000000000000000000000010000 = 
> 11111111111111111111111111101111
> +11111111111111111111111111111111 xor 11111111111111111111111111111111 = 
> 00000000000000000000000000000000
> +
> +*** Test binary operation '>>' ***
> +
> +00000000000000000000000000000000 >> -1 = <<exception>>
> +00000000000000000000000000000000 >> 0 = 00000000000000000000000000000000
> +00000000000000000000000000000000 >> 1 = 00000000000000000000000000000000
> +00000000000000000000000000000000 >> 2 = 00000000000000000000000000000000
> +00000000000000000000000000000000 >> 3 = 00000000000000000000000000000000
> +00000000000000000000000000000000 >> 4 = 00000000000000000000000000000000
> +00000000000000000000000000000000 >> 8 = 00000000000000000000000000000000
> +00000000000000000000000000000000 >> 16 = 00000000000000000000000000000000
> +00000000000000000000000000000000 >> 24 = 00000000000000000000000000000000
> +00000000000000000000000000000000 >> 31 = 00000000000000000000000000000000
> +00000000000000000000000000000000 >> 32 = <<exception>>
> +00000000000000000000000000000001 >> -1 = <<exception>>
> +00000000000000000000000000000001 >> 0 = 00000000000000000000000000000001
> +00000000000000000000000000000001 >> 1 = 00000000000000000000000000000000
> +00000000000000000000000000000001 >> 2 = 00000000000000000000000000000000
> +00000000000000000000000000000001 >> 3 = 00000000000000000000000000000000
> +00000000000000000000000000000001 >> 4 = 00000000000000000000000000000000
> +00000000000000000000000000000001 >> 8 = 00000000000000000000000000000000
> +00000000000000000000000000000001 >> 16 = 00000000000000000000000000000000
> +00000000000000000000000000000001 >> 24 = 00000000000000000000000000000000
> +00000000000000000000000000000001 >> 31 = 00000000000000000000000000000000
> +00000000000000000000000000000001 >> 32 = <<exception>>
> +00000000000000000000000000000010 >> -1 = <<exception>>
> +00000000000000000000000000000010 >> 0 = 00000000000000000000000000000010
> +00000000000000000000000000000010 >> 1 = 00000000000000000000000000000001
> +00000000000000000000000000000010 >> 2 = 00000000000000000000000000000000
> +00000000000000000000000000000010 >> 3 = 00000000000000000000000000000000
> +00000000000000000000000000000010 >> 4 = 00000000000000000000000000000000
> +00000000000000000000000000000010 >> 8 = 00000000000000000000000000000000
> +00000000000000000000000000000010 >> 16 = 00000000000000000000000000000000
> +00000000000000000000000000000010 >> 24 = 00000000000000000000000000000000
> +00000000000000000000000000000010 >> 31 = 00000000000000000000000000000000
> +00000000000000000000000000000010 >> 32 = <<exception>>
> +00000000000000000000000000001000 >> -1 = <<exception>>
> +00000000000000000000000000001000 >> 0 = 00000000000000000000000000001000
> +00000000000000000000000000001000 >> 1 = 00000000000000000000000000000100
> +00000000000000000000000000001000 >> 2 = 00000000000000000000000000000010
> +00000000000000000000000000001000 >> 3 = 00000000000000000000000000000001
> +00000000000000000000000000001000 >> 4 = 00000000000000000000000000000000
> +00000000000000000000000000001000 >> 8 = 00000000000000000000000000000000
> +00000000000000000000000000001000 >> 16 = 00000000000000000000000000000000
> +00000000000000000000000000001000 >> 24 = 00000000000000000000000000000000
> +00000000000000000000000000001000 >> 31 = 00000000000000000000000000000000
> +00000000000000000000000000001000 >> 32 = <<exception>>
> +00000000000000000000000000001010 >> -1 = <<exception>>
> +00000000000000000000000000001010 >> 0 = 00000000000000000000000000001010
> +00000000000000000000000000001010 >> 1 = 00000000000000000000000000000101
> +00000000000000000000000000001010 >> 2 = 00000000000000000000000000000010
> +00000000000000000000000000001010 >> 3 = 00000000000000000000000000000001
> +00000000000000000000000000001010 >> 4 = 00000000000000000000000000000000
> +00000000000000000000000000001010 >> 8 = 00000000000000000000000000000000
> +00000000000000000000000000001010 >> 16 = 00000000000000000000000000000000
> +00000000000000000000000000001010 >> 24 = 00000000000000000000000000000000
> +00000000000000000000000000001010 >> 31 = 00000000000000000000000000000000
> +00000000000000000000000000001010 >> 32 = <<exception>>
> +00000000000000000000000000010000 >> -1 = <<exception>>
> +00000000000000000000000000010000 >> 0 = 00000000000000000000000000010000
> +00000000000000000000000000010000 >> 1 = 00000000000000000000000000001000
> +00000000000000000000000000010000 >> 2 = 00000000000000000000000000000100
> +00000000000000000000000000010000 >> 3 = 00000000000000000000000000000010
> +00000000000000000000000000010000 >> 4 = 00000000000000000000000000000001
> +00000000000000000000000000010000 >> 8 = 00000000000000000000000000000000
> +00000000000000000000000000010000 >> 16 = 00000000000000000000000000000000
> +00000000000000000000000000010000 >> 24 = 00000000000000000000000000000000
> +00000000000000000000000000010000 >> 31 = 00000000000000000000000000000000
> +00000000000000000000000000010000 >> 32 = <<exception>>
> +11111111111111111111111111111111 >> -1 = <<exception>>
> +11111111111111111111111111111111 >> 0 = 11111111111111111111111111111111
> +11111111111111111111111111111111 >> 1 = 01111111111111111111111111111111
> +11111111111111111111111111111111 >> 2 = 00111111111111111111111111111111
> +11111111111111111111111111111111 >> 3 = 00011111111111111111111111111111
> +11111111111111111111111111111111 >> 4 = 00001111111111111111111111111111
> +11111111111111111111111111111111 >> 8 = 00000000111111111111111111111111
> +11111111111111111111111111111111 >> 16 = 00000000000000001111111111111111
> +11111111111111111111111111111111 >> 24 = 00000000000000000000000011111111
> +11111111111111111111111111111111 >> 31 = 00000000000000000000000000000001
> +11111111111111111111111111111111 >> 32 = <<exception>>
> +
> +*** Test binary operation '<<' ***
> +
> +00000000000000000000000000000000 << -1 = <<exception>>
> +00000000000000000000000000000000 << 0 = 00000000000000000000000000000000
> +00000000000000000000000000000000 << 1 = 00000000000000000000000000000000
> +00000000000000000000000000000000 << 2 = 00000000000000000000000000000000
> +00000000000000000000000000000000 << 3 = 00000000000000000000000000000000
> +00000000000000000000000000000000 << 4 = 00000000000000000000000000000000
> +00000000000000000000000000000000 << 8 = 00000000000000000000000000000000
> +00000000000000000000000000000000 << 16 = 00000000000000000000000000000000
> +00000000000000000000000000000000 << 24 = 00000000000000000000000000000000
> +00000000000000000000000000000000 << 31 = 00000000000000000000000000000000
> +00000000000000000000000000000000 << 32 = <<exception>>
> +00000000000000000000000000000001 << -1 = <<exception>>
> +00000000000000000000000000000001 << 0 = 00000000000000000000000000000001
> +00000000000000000000000000000001 << 1 = 00000000000000000000000000000010
> +00000000000000000000000000000001 << 2 = 00000000000000000000000000000100
> +00000000000000000000000000000001 << 3 = 00000000000000000000000000001000
> +00000000000000000000000000000001 << 4 = 00000000000000000000000000010000
> +00000000000000000000000000000001 << 8 = 00000000000000000000000100000000
> +00000000000000000000000000000001 << 16 = 00000000000000010000000000000000
> +00000000000000000000000000000001 << 24 = 00000001000000000000000000000000
> +00000000000000000000000000000001 << 31 = 10000000000000000000000000000000
> +00000000000000000000000000000001 << 32 = <<exception>>
> +00000000000000000000000000000010 << -1 = <<exception>>
> +00000000000000000000000000000010 << 0 = 00000000000000000000000000000010
> +00000000000000000000000000000010 << 1 = 00000000000000000000000000000100
> +00000000000000000000000000000010 << 2 = 00000000000000000000000000001000
> +00000000000000000000000000000010 << 3 = 00000000000000000000000000010000
> +00000000000000000000000000000010 << 4 = 00000000000000000000000000100000
> +00000000000000000000000000000010 << 8 = 00000000000000000000001000000000
> +00000000000000000000000000000010 << 16 = 00000000000000100000000000000000
> +00000000000000000000000000000010 << 24 = 00000010000000000000000000000000
> +00000000000000000000000000000010 << 31 = 00000000000000000000000000000000
> +00000000000000000000000000000010 << 32 = <<exception>>
> +00000000000000000000000000001000 << -1 = <<exception>>
> +00000000000000000000000000001000 << 0 = 00000000000000000000000000001000
> +00000000000000000000000000001000 << 1 = 00000000000000000000000000010000
> +00000000000000000000000000001000 << 2 = 00000000000000000000000000100000
> +00000000000000000000000000001000 << 3 = 00000000000000000000000001000000
> +00000000000000000000000000001000 << 4 = 00000000000000000000000010000000
> +00000000000000000000000000001000 << 8 = 00000000000000000000100000000000
> +00000000000000000000000000001000 << 16 = 00000000000010000000000000000000
> +00000000000000000000000000001000 << 24 = 00001000000000000000000000000000
> +00000000000000000000000000001000 << 31 = 00000000000000000000000000000000
> +00000000000000000000000000001000 << 32 = <<exception>>
> +00000000000000000000000000001010 << -1 = <<exception>>
> +00000000000000000000000000001010 << 0 = 00000000000000000000000000001010
> +00000000000000000000000000001010 << 1 = 00000000000000000000000000010100
> +00000000000000000000000000001010 << 2 = 00000000000000000000000000101000
> +00000000000000000000000000001010 << 3 = 00000000000000000000000001010000
> +00000000000000000000000000001010 << 4 = 00000000000000000000000010100000
> +00000000000000000000000000001010 << 8 = 00000000000000000000101000000000
> +00000000000000000000000000001010 << 16 = 00000000000010100000000000000000
> +00000000000000000000000000001010 << 24 = 00001010000000000000000000000000
> +00000000000000000000000000001010 << 31 = 00000000000000000000000000000000
> +00000000000000000000000000001010 << 32 = <<exception>>
> +00000000000000000000000000010000 << -1 = <<exception>>
> +00000000000000000000000000010000 << 0 = 00000000000000000000000000010000
> +00000000000000000000000000010000 << 1 = 00000000000000000000000000100000
> +00000000000000000000000000010000 << 2 = 00000000000000000000000001000000
> +00000000000000000000000000010000 << 3 = 00000000000000000000000010000000
> +00000000000000000000000000010000 << 4 = 00000000000000000000000100000000
> +00000000000000000000000000010000 << 8 = 00000000000000000001000000000000
> +00000000000000000000000000010000 << 16 = 00000000000100000000000000000000
> +00000000000000000000000000010000 << 24 = 00010000000000000000000000000000
> +00000000000000000000000000010000 << 31 = 00000000000000000000000000000000
> +00000000000000000000000000010000 << 32 = <<exception>>
> +11111111111111111111111111111111 << -1 = <<exception>>
> +11111111111111111111111111111111 << 0 = 11111111111111111111111111111111
> +11111111111111111111111111111111 << 1 = 11111111111111111111111111111110
> +11111111111111111111111111111111 << 2 = 11111111111111111111111111111100
> +11111111111111111111111111111111 << 3 = 11111111111111111111111111111000
> +11111111111111111111111111111111 << 4 = 11111111111111111111111111110000
> +11111111111111111111111111111111 << 8 = 11111111111111111111111100000000
> +11111111111111111111111111111111 << 16 = 11111111111111110000000000000000
> +11111111111111111111111111111111 << 24 = 11111111000000000000000000000000
> +11111111111111111111111111111111 << 31 = 10000000000000000000000000000000
> +11111111111111111111111111111111 << 32 = <<exception>>
> diff --git a/tests/hard_coded/uint_bitwise.m 
> b/tests/hard_coded/uint_bitwise.m
> index e69de29bb..c4c34a78b 100644
> --- a/tests/hard_coded/uint_bitwise.m
> +++ b/tests/hard_coded/uint_bitwise.m
> @@ -0,0 +1,198 @@
> +%---------------------------------------------------------------------------%
> +% vim: ft=mercury ts=4 sw=4 et wm=0 tw=0
> +%---------------------------------------------------------------------------%
> +
> +% Test bitwise operations for unsigned integers.
> +
> +:- module uint_bitwise.
> +:- interface.
> +
> +:- import_module io.
> +
> +:- pred main(io::di, io::uo) is cc_multi.
> +
> +%---------------------------------------------------------------------------%
> +%---------------------------------------------------------------------------%
> +
> +:- implementation.
> +
> +:- import_module int.
> +:- import_module uint.
> +
> +:- import_module exception.
> +:- import_module list.
> +:- import_module require.
> +:- import_module string.
> +
> +%---------------------------------------------------------------------------%
> +
> +main(!IO) :-
> +    run_unop_test(uint.(\), "\\", !IO),
> +    io.nl(!IO),
> +    run_binop_test(uint.(/\), "/\\", !IO),
> +    io.nl(!IO),
> +    run_binop_test(uint.(\/), "\\/", !IO),
> +    io.nl(!IO),
> +    run_binop_test(uint.(xor), "xor", !IO),
> +    io.nl(!IO),
> +    run_shift_test(uint.(>>), ">>", !IO),
> +    io.nl(!IO),
> +    run_shift_test(uint.(<<), "<<", !IO).
> +
> +%---------------------------------------------------------------------------%
> +
> +:- pred run_unop_test((func(uint) = uint)::in, string::in,
> +    io::di, io::uo) is cc_multi.
> +
> +run_unop_test(UnOpFunc, Desc, !IO) :-
> +    io.format("*** Test unary operation '%s' ***\n\n", [s(Desc)], !IO),
> +    As = numbers,
> +    list.foldl(run_unop_test_2(UnOpFunc, Desc), As, !IO).
> +
> +:- pred run_unop_test_2((func(uint) = uint)::in, string::in,
> +    uint::in, io::di, io::uo) is cc_multi.
> +
> +run_unop_test_2(UnOpFunc, Desc, A, !IO) :-
> +    ( try []
> +        Result0 = UnOpFunc(A)
> +    then
> +        ResultStr = to_binary_string_lz(Result0)
> +    catch_any _ ->
> +        ResultStr = "<<exception>>"
> +    ),
> +    io.format("%s %s = %s\n",
> +        [s(Desc), s(to_binary_string_lz(A)), s(ResultStr)], !IO).
> +
> +%---------------------------------------------------------------------------%
> +
> +:- pred run_binop_test((func(uint, uint) = uint)::in, string::in,
> +    io::di, io::uo) is cc_multi.
> +
> +run_binop_test(BinOpFunc, Desc, !IO) :-
> +    io.format("*** Test binary operation '%s' ***\n\n", [s(Desc)], !IO),
> +    As = numbers,
> +    Bs = numbers,
> +    list.foldl(run_binop_test_2(BinOpFunc, Desc, Bs), As, !IO).
> +
> +:- pred run_binop_test_2((func(uint, uint) = uint)::in, string::in,
> +    list(uint)::in, uint::in, io::di, io::uo) is cc_multi.
> +
> +run_binop_test_2(BinOpFunc, Desc, Bs, A, !IO) :-
> +    list.foldl(run_binop_test_3(BinOpFunc, Desc, A), Bs, !IO).
> +
> +:- pred run_binop_test_3((func(uint, uint) = uint)::in, string::in,
> +    uint::in, uint::in, io::di, io::uo) is cc_multi.
> +
> +run_binop_test_3(BinOpFunc, Desc, A, B, !IO) :-
> +    ( try []
> +        Result0 = BinOpFunc(A, B)
> +    then
> +        ResultStr = to_binary_string_lz(Result0)
> +    catch_any _ ->
> +        ResultStr = "<<exception>>"
> +    ),
> +    io.format("%s %s %s = %s\n",
> +        [s(to_binary_string_lz(A)), s(Desc),
> +        s(to_binary_string_lz(B)), s(ResultStr)], !IO).
> +
> +%---------------------------------------------------------------------------%
> +
> +:- pred run_shift_test((func(uint, int) = uint)::in, string::in,
> +    io::di, io::uo) is cc_multi.
> +
> +run_shift_test(ShiftOpFunc, Desc, !IO) :-
> +    io.format("*** Test binary operation '%s' ***\n\n", [s(Desc)], !IO),
> +    As = numbers,
> +    Bs = shift_amounts,
> +    list.foldl(run_shift_test_2(ShiftOpFunc, Desc, Bs), As, !IO).
> +
> +:- pred run_shift_test_2((func(uint, int) = uint)::in, string::in,
> +    list(int)::in, uint::in, io::di, io::uo) is cc_multi.
> +
> +run_shift_test_2(ShiftOpFunc, Desc, Bs, A, !IO) :-
> +    list.foldl(run_shift_test_3(ShiftOpFunc, Desc, A), Bs, !IO).
> +
> +:- pred run_shift_test_3((func(uint, int) = uint)::in, string::in,
> +    uint::in, int::in, io::di, io::uo) is cc_multi.
> +
> +run_shift_test_3(ShiftOpFunc, Desc, A, B, !IO) :-
> +    ( try []
> +        Result0 = ShiftOpFunc(A, B)
> +    then
> +        ResultStr = to_binary_string_lz(Result0)
> +    catch_any _ ->
> +        ResultStr = "<<exception>>"
> +    ),
> +    io.format("%s %s %d = %s\n",
> +        [s(to_binary_string_lz(A)), s(Desc), i(B), s(ResultStr)], !IO).
> +
> +%---------------------------------------------------------------------------%
> +
> +:- func numbers = list(uint).
> +
> +numbers = [
> +    0u,
> +    1u,
> +    2u,
> +    8u,
> +    10u,
> +    16u,
> +    max_uint
> +].
> +
> +:- func shift_amounts = list(int).
> +
> +shift_amounts = [
> +    -1,
> +    0,
> +    1,
> +    2,
> +    3,
> +    4,
> +    8,
> +    16,
> +    24,
> +    bits_per_uint - 1,
> +    bits_per_uint
> +].
> +
> +%---------------------------------------------------------------------------%
> +
> +:- func to_binary_string_lz(uint::in) = (string::uo) is det.
> +
> +:- pragma foreign_proc("C",
> +    to_binary_string_lz(U::in) = (S::uo),
> +    [will_not_call_mercury, promise_pure, thread_safe, 
> will_not_modify_trail],
> +"
> +    int i = ML_BITS_PER_UINT;
> +
> +    MR_allocate_aligned_string_msg(S, ML_BITS_PER_UINT, MR_ALLOC_ID);
> +    S[ML_BITS_PER_UINT] = '\\0';
> +    while (i >= 0) {
> +        i--;
> +        S[i] = (U & 1) ? '1' : '0';
> +        U = U >> 1;
> +    }
> +").
> +
> +:- pragma foreign_proc("C#",
> +    to_binary_string_lz(U::in) = (S::uo),
> +    [will_not_call_mercury, promise_pure, thread_safe],
> +"
> +    S = System.Convert.ToString(U, 2).PadLeft(32, '0');
> +").
> +
> +:- pragma foreign_proc("Java",
> +    to_binary_string_lz(U::in) = (S::uo),
> +    [will_not_call_mercury, promise_pure, thread_safe],
> +"
> +    S = java.lang.String.format(""%32s"",
> +        java.lang.Integer.toBinaryString(U)).replace(' ', '0');
> +").
> +
> +to_binary_string_lz(_) = _ :-
> +    sorry($file, $pred, "to_binary_string_lz for Erlang backend").
> +
> +%---------------------------------------------------------------------------%
> +:- end_module uint_bitwise.
> +%---------------------------------------------------------------------------%
>


More information about the reviews mailing list