スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門基本編落穂拾い その13 (bit(2))

さて前回はstrBitなる関数を定義してbyte型の数に対してビットでの表現を視覚化できるようにしました。
 
> strBit  '■' '□' 3uy;;
val it : string = "□□□□□□■■"
 
> strBit  '■' '□' 8uy;;
val it : string = "□□□□■□□□"
 
部分適用して、おきます。
 
> let strBit1 = strBit  '■' '□';;
val strBit1 : (byte -> string)
 
それでは今回はこれを用いてビット毎の論理積と論理和を調べていきたいと思います。
 
論理積というのは、二つの数のビット表現に対し、両方ともビットが立っているビットについては、ビットを立てて、それ以外のビットはビットを立てない数を返す演算です。次の例をみてください。
 
まず98uyと 78uyを例として取り上げます。
 
> strBit1 98uy;;
val it : string = "□■■□□□■□"
> strBit1 78uy;;
val it : string = "□■□□■■■□"
 
論理積は&&&で表されるので次のようにします。
 
> strBit1 (98uy &&& 78uy);;
val it : string = "□■□□□□■□"
 
まとめると次のようになります。
"□■■□□□■□"   98uy 
"□■□□■■■□"   78uy
"□■□□□□■□"   (98uy &&& 78uy)
 
両方ともビットが立っているビットだけが立っていることが分かると思います。
 
次は論理和です。
 
論理積というのは、二つの数のビット表現に対し、少なくとも一方のビットが立っているビットについては、ビットを立てて、それ以外のビットはビットを立てない数を返す演算です。論理和は|||で表されるので次のようにします
 
> strBit1 (98uy ||| 78uy);;
val it : string = "□■■□■■■□"
 
まとめると次のようになります。
"□■■□□□■□" 98uy 
"□■□□■■■□" 78uy
"□■■□■■■□" (98uy ||| 78uy)
 
 
さて次は論理積を使ってあるビットが立っているかどうかの判定を行ってみます。
 
例えば 1* 2^5は "□□■□□□□□"が内部表現となりますが、
これと内部表現が "??☆?????"である数との論理積をとると
?の部分がなんであっても、☆が■の場合は"□□■□□□□□"
☆が□の場合は□□□□□□□□となります。
よって(1*2^5) &&& x = (1*2^5)ならxの下から5番目(一番下は0番目とします)のビットは立っていて、
(1*2^5) &&& x = 0なら下から5番目(一番下は0番目とします)のビットは立っていないことが分かります。
 
ということで、下からk番目のビットが立っているかどうかを調べる関数は次のように定義できます。
 
> let isBitOn k n =
    (n &&& ( 1uy <<< k)) <> 0uy;;
 
val isBitOn : int32 -> byte -> bool
 
> isBitOn 0 3uy;;
val it : bool = true
> isBitOn 1 3uy;;
val it : bool = true
> isBitOn 2 3uy;;
val it : bool = false
 
さて次は論理和を使ってある数のあるビットだけを立てる方法を考えます。
 
元の数 ??☆?????
1* 2^5 □□■□□□□□
として(元の数)|||(1*2^5)を考えると?の部分は変化せず、☆の部分が必ず ■となった数が得られます。
 
ということで、ある数に対し、下からk番目のビットを立てる(元から立っている場合は変化なし)関数は次のように定義できます。
 
> let bitOn k n =
     n ||| (1uy <<< k);;
 
val bitOn : int32 -> byte -> byte
 
> let t = 3uy;;
val t : byte = 3uy
 
> strBit1 t;;
val it : string = "□□□□□□■■"
 
> let t1 = bitOn 3 t;;
val t1 : byte = 11uy
 
> strBit1 t1;;
val it : string = "□□□□■□■■"
 
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。