任意の整数をビット列に化けさせてストリームで取り出すなんてのは 他の言語も含めてどんな感じになるんだろうか。
ときどきの雑記帖
経由で、
今回は、どう書く?org の「逆転したビット列 」をF#で書いてみました。 問題は、
32以下の正の整数nが与えられた場合に、 0以上、2のn乗未満の整数を「ビット的に逆転したもの」のリストを作成する関数を書いてください。というものです。
なお「ビット的に逆転」とはnotを使った反転ではなく、 「0001」を「1000」にするような処理を指すものとします。n = 4の時には [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15] が正解です。
http://techbank.jp/Community/blogs/gushwell/archive/2010/11/27/29553.aspx
を Squeak Smalltalk で書くとこんな感じ。やっていることは、ほぼ きむら(K)さんの Ruby版 と同じに。
| n | n := 4. (0 to: (2 raisedTo: n) - 1) collect: [:int | Integer readFrom: ( int printStringBase: 2 length: n padded: true) reversed base: 2] "=> #(0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15) "
あるいは、
| n | n := 4. (0 to: (2 raisedTo: n) - 1) collect: [:int | ('2r', (int printStringBase: 2 length: n padded: true) reversed) asNumber] "=> #(0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15) "
とか。
そういえば、元ネタの どう書く?.org のときはどんなのを投稿したのだったかな…と思って見てみたら、
| flipBits | flipBits := [:numOfBits :vals | | form bits | form := Form extent: 32 @ vals size. form bits: (Bitmap newFrom: vals). bits := (form flipBy: #horizontal centerAt: 0@0) bits. bits asArray collect: [:each | each >> (32 - numOfBits)]]. ^flipBits value: 4 value: (0 to: 15) "=> #(0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15) "
おもいっきり脱線していて笑った。