スポンサーサイト

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

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

前回に続けてビット演算を紹介します。まずは排他的論理和 ( XOR )です。
これは二つの数のビット表現に対し一方だけのビットが立っているビットについては、ビットを立てて、それ以外のビットはビットを立てない数を返す演算です
演算子は^^^です。
 
> strBit1 (98uy ^^^ 78uy);;
val it : string = "□□■□■■□□"
 
"□■■□□□■□"  98uy              
"□■□□■■■□"  78uy               
"□□■□■■□□"  (98uy ^^^ 78uy)    
 
(a ^^^ b) ^^^ b = a となる性質があります。
 

"□■■□□□■□"  98uy                       
"□■□□■■■□"  78uy                       
"□□■□■■□□"  (98uy ^^^ 78uy)            
"□■■□□□■□"  ((98uy ^^^ 78uy) ^^^ 78uy) (一番上と一致)
 
次はビット反転です。これは、すべてのビットに対して「立っているビットは、立っていない状態に」「立っていないビットは、立っている状態に」するという演算です。
演算子は~~~です。
 

"□■■□□□■□"    98uy      
"■□□■■■□■" ~~~98uy   
 
ここまでは、符号なし(unsigned)であるbyteについて調べてきましたが、次は符号ありである、sbyteについて負の数のビット表現はどうなっているかについてふれたいと思います。
次を見てください。
 
sbyte                    byte
0y     □□□□□□□□   0uy
1y     □□□□□□□■   1uy
2y     □□□□□□■□   2uy
3y     □□□□□□■■   3uy
4y     □□□□□■□□   4uy
5y     □□□□□■□■   5uy
6y     □□□□□■■□   6uy
7y     □□□□□■■■   7uy
8y     □□□□■□□□   8uy
9y     □□□□■□□■   9uy
10y    □□□□■□■□  10uy
11y    □□□□■□■■  11uy
12y    □□□□■■□□  12uy
13y    □□□□■■□■  13uy
14y    □□□□■■■□  14uy
15y    □□□□■■■■  15uy
16y    □□□■□□□□  16uy
17y    □□□■□□□■  17uy
         中略
123y   □■■■■□■■ 123uy
124y   □■■■■■□□ 124uy
125y   □■■■■■□■ 125uy
126y   □■■■■■■□ 126uy
127y   □■■■■■■■ 127uy ↑ここまで同じ
-128y  ■□□□□□□□ 128uy ↓ここから異なる
-127y  ■□□□□□□■ 129uy
-126y  ■□□□□□■□ 130uy
-125y  ■□□□□□■■ 131uy
-124y  ■□□□□■□□ 132uy
-123y  ■□□□□■□■ 133uy
-122y  ■□□□□■■□ 134uy
-121y  ■□□□□■■■ 135uy
         中略
-9y    ■■■■□■■■ 247uy
-8y    ■■■■■□□□ 248uy
-7y    ■■■■■□□■ 249uy
-6y    ■■■■■□■□ 250uy
-5y    ■■■■■□■■ 251uy
-4y    ■■■■■■□□ 252uy
-3y    ■■■■■■□■ 253uy
-2y    ■■■■■■■□ 254uy
-1y    ■■■■■■■■ 255uy
 
ご覧の通り最上位のビットが立っていないときは同じ数を表しますが、最上位のビットが立った時点で、符号付きの方は、負数の表現になります。
 
int16とuint16,int(=int32)とuint32も同様の関係となります。
 
それでは演算子を使って各型の表すことのできる最大最小値等を調べてみます。
 
> (~~~0uy);; //byteの最大
val it : byte = 255uy
 
> (1y) <<< 7;; //sbyteの最小
val it : sbyte = -128y
 
> ~~~((1y) <<< 7);;//sbyteの最大
val it : sbyte = 127y
 
> (~~~0y) >>> 1;; //sbyteの最大を求めようとしたが、何故かこれはダメ
val it : sbyte = -1y
 
> (~~~0us);; //uint16の最大
val it : uint16 = 65535us
 
> (1s) <<< 15;;//int16の最小
val it : int16 = -32768s
 
> ~~~((1s) <<< 15);;//int16の最大
val it : int16 = 32767s
 
 (~~~0u);; //uint32の最大
val it : uint32 = 4294967295u
 
> (1) <<< 31;;//int32の最小
val it : int = -2147483648 
 
> ~~~((1) <<< 31);;//int32の最大
val it : int = 2147483647
 
最後に8進数、16進数表記についてふれておきます。
 
2進法では最初に0b 最後に型をつけて数を表すのでしたが、
8進法では最初に0o 最後に型をつけて数を表し
16進法では最初に0x 最後に型をつけて数を表します。
型指定がないときはint(=int32)型になります。

 
> 0o11u;;
val it : uint32 = 9u
 
> 0x11u;;
val it : uint32 = 17u
 
> 0xA1u;;
val it : uint32 = 161u
 
また、byte,uint16等は変換関数としても定義されています。
 
> uint16 8u;;
val it : uint16 = 8us
 
ただ、表せる最大数をこえる数を変換させても、例外は発生しませんから注意が必要です。
 
> uint16 4294966;; //uint16で表せる最大数32767をこえている。
val it : uint16 = 35126us
 
 
(追記)
int64は最後にL,uint64は最後にULをつけて表します。
 
> 21474836479UL;;
val it : uint64 = 21474836479UL
スポンサーサイト

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

コメントの投稿

非公開コメント

No title

>sbyteの最大を求めようとしたが、何故かこれはダメ
符号付きの数をシフトする時は、算術シフトになるから。
つまり、
右シフトは、/ 2 の意味だから
-2 を右シフトは、-1 にならなきゃいけない。(空きビットには符号が補われる)
算術シフトと論理シフトについては、C言語なんかもそうで、シフト対象で動作が変わる。

コメントする必要はないけど、
最大値は、
System.SByte.MaxValue
のようにして求められる。

No title

BlUEPIXYさん、ご教授ありがとうございます。勉強になりました。
話は変わりますが、「ロケみつ」(総集編・四国編)で、早希殿が、私の親戚のうどん屋でモーニングうどんを食べていました。
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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