Steffen Nurpmeso <stef...@sdaoden.eu> writes:
> I realized there is no unsigned right shift in bash arithmetic
> expression, and thought maybe there is interest.

This would be difficult to define cleanly.

Currently, arithmetic values are considered to be signed, and >>
operates on them as such.  So

    $ echo $(( 1 >> 1 ))
    0
    $ echo $(( 2 >> 1 ))
    1
    $ echo $(( 3 >> 1 ))
    1
    $ echo $(( (-1) >> 1 ))
    -1
    $ echo $(( (-2) >> 1 ))
    -1
    $ echo $(( (-3) >> 1 ))
    -2
    $ echo $(( (-4) >> 1 ))
    -2
    $

For positive values, unsigned right shift would be the same as >>.  But
for negative numbers, the value has to be cast into an unsigned value,
which is then right-shifted (equivalently, divided by a power of 2), and
the resulting value then has to be cast back into a signed value.

But that will depend on (reveal) the word length of Bash arithmetic
computation:  (-1) >>> 1 will be equal to 2#01111...1111, which prints
as a positive number.  In contrast the current Bash arithmetic model is
"word-length agnostic as long as you don't overflow", it acts as if the
values are mathematical integers.

Dale

Reply via email to