せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】【アルゴリズム】ビット演算。1 になっているビット数を数える。

ビット演算・・ってアルゴリズムを考える上で便利かも。
と思って勉強してみる。

このサイトが、
どういうときにビット演算を使うと便利なのか、
が分かりやすく書いてあって面白かったです。
 
記念すべき1問目

レジスタ中の 1 になっているビット数を数えるアルゴリズム

を解いてみます。


 

ポイント:数値の渡し方

p 1101 & 10

 
■実行結果

8

 
はて?
そうか。最初の式は2進法だと認識されず

10001001101 & 1010

と認識されているのか。

 

ポイント:論理積の結果表示

たとえば、

p 0b1111 & 0b10

とすると「2」が表示される。
pメソッドは数値を10進法で表示するため。
 
2進法(ビット)のまま表示したいと思ったら
こうするしかないのか?

printf("%b",(0b1111 & 0b10))

うーん。。?
 
とってもやさしい師匠に聞いてみよう。

 

ビット数を数える

レジスタ中の 1 になっているビット数を数えるアルゴリズム

このサイトを参考に。

 

def numofbits1(bits)
  num = 0
  mask = 1
  while(mask != 0) do
    break if 1 << 31  == mask
    num += 1 if (bits & mask) != 0 #←オドロキ!
    mask <<= 1
  end
  num
end
p numofbits1(0b10010101010101)

 
■実行結果

7


これがビット演算かー。