「擬似コード」を含む日記 RSS

はてなキーワード: 擬似コードとは

2009-06-15

うんコード

例えば下記の擬似コード


 i = 1;
 while( i & 7 ) {
   i++;
 }

勘弁して。いや、わかるよ。言いたいことはさ。でも俺こういう書き方慣れてないから脳内で素早く2進数変換できないの。

いや単なるイディオムとして覚えてればいい話ってのはごもっともだけど普段こういう書き方しないからパッと出てこないんだよね。

一応これがいまいちわからない人のために説明すると


 i = 1;
 while( i < 8 ) {
   i++;
 }

ってことだから。(厳密に言えば少し違うが、ここでの話はこれで良い)

なんちゅーかさ。条件が10以下とかに変わるだけで破綻するしさ。

ってかもう今時のコンパイラならコレくらいの変換勝手にやってくれるんじゃねーの?(さすがにまだまだ?この辺疎い)

そうであれば速度的は変わらないわけで単純に可読性&拡張性低下させてるだけの存在になるよね。

まあでもこれは基本的なことなんだけど、自分では書かなくても読めるようにはならないといけないってのは真なので文句を言ってるだけじゃ何も変わらない。

ということでみんなガンガンこういうコードを書いていこう。

もっともっと書いて書いて書きまくろう。

上のような処理は各ビットが全部立ってる場合に有効になるので算出方法としては


 (1 << x) - 1

となる。

つまり2の累乗から1引くと各ビットが立った数値となるわけなのです


10進数 2進数
   1 00000001
   3 00000011
   7 00000111
  15 00001111
  31 00011111
  63 00111111
 127 01111111
      :

ビットが全部立ってる数値を&で評価すると、その値を一つ超える数値、すなわち2の倍数が来るまでは常に真となるわけですね。

先ほどの処理で言うならばこういうことになります。


 i & 7 = x

(1)00000001 & (7)00000111 = 00000001
(2)00000010 & (7)00000111 = 00000010
(3)00000011 & (7)00000111 = 00000011
(4)00000100 & (7)00000111 = 00000100
(5)00000101 & (7)00000111 = 00000101
(6)00000110 & (7)00000111 = 00000110
(7)00000111 & (7)00000111 = 00000111
(8)00001000 & (7)00000111 = 00000000

という感じでiが8になった時点で7との論理演算の結果が偽となるため、ループが終了します。

正直スクリプト言語から入るとこういう低レベル計算を行うことは殆どないし、逆にこういうコードを書いてると先輩から怒られます。

なので自分で学ばない限りなかなかこれらのコードを直に理解できる状態にはならないので注意が必要です。

コードというのは「書けなくても、書かなくても、読めなければならない」これ鉄則。



プログラ増田のあなぐら

- 転職ならen
- 派遣ならen
 
1ページ中1ページ目を表示(合計:1件)