スポンサーサイト

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

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

1 バイトは 8 ビットで、各ビットはon(1で表す) かoff(0で表す)です。
その様子を表したものを、ビットパターンといいます。
1 バイトは2の8乗通りのパターンがあるので、256種類の数を表すことができます。
 
1バイトで表すことのできる整数型はbyte(unsigned符号なし)とsbyte(signed符号あり)の2種類があります。
 
byteは.NETではSystem.Byteでuyを末尾につけて表します。表せる数は0から255までの256種類です。
 
> let t = 23uy;;
val t : byte = 23uy
 
sbyteは.NETではSystem.SByteでyを末尾につけて表します。表せる数は-128から127までの256種類です。
 
> let n = -23y;;
val n : sbyte = -23y
 
uint16はunsigned integer 16ビットですから、表せる数は0から(2の16乗)-1までです。
ちなみにpown関数を使うと「べき乗」が計算できます。
 
> pown;;
val it : (int -> int -> int) = <fun:it@12>
 
> pown 2uy 3;;
val it : byte = 8uy
 
> pown 2 16;;
val it : int = 65536
 
ということでuint16で0から65535まで表すことができます。
int16は-32768から32767まで
uint32は0から4294967295まで
int32は-2147483648から2147483647までとなります。
int32が通常使っているintの別名です。
 
さてunsingedのタイプについては、上のそれぞれの数は2進数で表した時のビットパターンで表現されます。
byte型は1 バイトすなわち 8 ビットを使用するのですが、
例えば0は2進数で表すと0*2^7+0*2^6+0*2^5+0*2^4+0*2^3+0*2^2+0*2^1+0*2^0
で00000000が対応します。
同様に
1⇔00000001
2⇔00000010
3⇔00000011
4⇔00000100
というようになっていきます。
右側のビットによる表現を左側の形に直すには、頭に0b、最後に型をつけます。

> 0b00000011uy;;
val it : byte = 3uy
 
特に数字を8個にする必要はありません。
> 0b11uy;;
val it : byte = 3uy
 
最後に型を指定しない場合は、int(=int32)型になります。
> 0b10000000000;;
val it : int = 1024
 
ビットによる表現を考える時に便利な演算子がありますからこれを次に紹介します。
まずは右シフト演算子(>>>)です。
例えば0b10uy >>> 1 で0b10uyを右に一つ(1bit)シフトします。
 
> 0b10uy >>> 1;;
val it : byte = 1uy
 
もとは2でしたが1になりました。
2進数表示の性質より、右に一つシフトするということは2で割るということに対応します。
 
> 0b100uy >>> 1;; // 4/2に対応
val it : byte = 2uy
 
> 0b111uy >>> 1;;
val it : byte = 3uy // 7/2に対応
 
同様に左に一つシフトするということは2をかけることに対応します。
 
> 0b111uy <<< 1;; // 7*2に対応
val it : byte = 14uy
 
さてこのことを用いて一番下のビット(第0ビット)が立っているかどうか調べる関数を作ってみます。
 
まずは例として10101001を取り上げます。
一番下の位に注意してください。
この数を右に一つシフトして左に一つシフトすると10101000になり元の数と等しくありません。
一方10101000を右に一つシフトして左に一つシフトすると10101000となり元の数と等しくなります。
よって右に一つシフトして左に一つシフトしたものと元の数をくらべて、等しければ一番下のbitは立っていることになり、異なっていれば立っていないことになります。
 
よって一番下のビットが立っているかどうか調べる関数のbyte対応版は次のようになります。
>let isLowestBitOn (n: byte)=
    ((n >>> 1) <<< 1) <> n ;;
    
val isLowestBitOn : byte -> bool
 
> isLowestBitOn 0b10111uy;;
val it : bool = true
> isLowestBitOn 0b10110uy;;
val it : bool = false
 
isLowestBitOnは奇数かどうかの判定にも使えます。
一般には一番左のビットを最上位ビット ( MSB: Most Significant Bit )、一番右のビットを最下位ビット ( LSB: Least Significant Bit ) と呼びます。
 
さてこの関数を利用して3uyを00000011のように表示する関数を作ってみます。
 
> let strBit0 n =
    let rec sub rem res counter =
        if counter = 8 then
            res
        else
            let ch = if isLowestBitOn rem then
                        '1'
                     else 
                        '0'
            sub (rem >>> 1) (ch :: res) (counter+1)
    new string( Array.ofList(sub n [] 0));;
 
val strBit0 : byte -> string
 
> strBit0 7uy;;
val it : string = "00000111"
 
せっかくですから、0,1の代わりに好きなcharacterで表示できるようにします。
 
> let strBit chOn chOff n =
    let rec sub rem res counter =
        if counter = 8 then
            res
        else
            let ch = if isLowestBitOn rem then
                        chOn
                     else 
                        chOff
            sub (rem >>> 1) (ch :: res) (counter+1)
    new string( Array.ofList(sub n [] 0));;
 
val strBit : char -> char -> byte -> string
 
> strBit  '■' '□' 3uy;;
val it : string = "□□□□□□■■"
 
> strBit  '■' '□' 8uy;;
val it : string = "□□□□■□□□"
 
(備考)System.Convert.ToString(9uy,2)としてやれば2進数表記を得ることができます。
 
> System.Convert.ToString(9uy,2);;
val it : string = "1001"
スポンサーサイト

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

コメントの投稿

非公開コメント

typo

byteは.NETではSytem.Byte → byteは.NETではSystem.Byte
sbyteは.NETではSytem.Byte → sbyteは.NETではSystem.SByte
uint32は0から4294967296まで → uint32は0から4294967295まで

No title

BLUEPIXYさん、ありがとうございます。訂正しました。
最近「プログラミングClojure」なる本を買って、よく分からんなりに、ちらちら見ているのですが、なかなか強力な言語の匂いがします。

プログラミングClojure

その本私も買いました。
ぼちぼち読んでいるところです。
私は、scheme, Common Lisp の経験があるので、そんなに難しくはないですが、
Clojure 風というか何が使えるのかを勉強中です。
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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