質問: posix shell だけでどこまで計算できるものなのかを知りたいと思い、 bit 演算がどうやったら実現できるのか知りたいと思いました。(特に、 sha256/md5 などを実装してみようとしていた) 32 bit の right rotation bit shift 演算を実現したいです。これは、どうやったらできるでしょうか。 shell には arithmetic expansion があり、数値型としては signed long は保証されていること、 bit 演算子たちがあることから、たぶん実現できそうだ、とは思っています。しかし、 long の bit 長って取得できたんだっけ、それをふまえて正しい bit 演算って何なんだっけ、と思っているので、質問しています。
回答: 何をやりたいのかいまひとつわかりませんが、32 bit 整数のビットのシフト、ローテートならこんな感じでしょうか。(効率等は考えていません) ``` #!/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 ```