posix shell にて 32bit right rotation を実現したい


posix shell だけでどこまで計算できるものなのかを知りたいと思い、 bit 演算がどうやったら実現できるのか知りたいと思いました。(特に、
sha256/md5 などを実装してみようとしていた)

32 bit の right rotation bit shift 演算を実現したいです。これは、どうやったらできるでしょうか。 shell には
[arithmetic
expansion](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04)
があり、数値型としては signed long は保証されていること、 bit 演算子たちがあることから、たぶん実現できそうだ、とは思っています。しかし、
long の bit 長って取得できたんだっけ、それをふまえて正しい bit 演算って何なんだっけ、と思っているので、質問しています。




何をやりたいのかいまひとつわかりませんが、32 bit 整数のビットのシフト、ローテートならこんな感じでしょうか。(効率等は考えていません)

[code]

    #!/bin/sh
    
    ## 32 bit 整数の MSB
    msb=2147483648
    ## 33 bit 整数の MSB
    msbx2=$((msb*2))
    
    ## 32 bit を越える整数を扱えるかどうかのテスト
    [ $msbx2 -gt $msb ] || exit 1
    
    while read v; do
      ## 32 bit 整数に丸める
      v=$((v % msbx2))
      printf 'input         %8x\n' $v
      printf 'right shift:  %8x\n' $(( v / 2 ))
      printf 'left shift:   %8x\n' $(( v * 2 % msbx2 ))
      printf 'right rotate: %8x\n' $(( v / 2 + v % 2 * msb))
      printf 'left rotate:  %8x\n' $(( v * 2 % msbx2 + v / msb))
    done
    
[/code]

