「逆転したビット列」を Squeak Smalltalk で

任意の整数をビット列に化けさせてストリームで取り出すなんてのは 他の言語も含めてどんな感じになるんだろうか。

ときどきの雑記帖


経由で、

http://ja.doukaku.org/61/

今回は、どう書く?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) "


おもいっきり脱線していて笑った。