ホーム » スタッフ » 斉藤徹 » 浮動小数点データ・bit演算・#defineマクロ

2012年5月
« 4月   6月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  

最近の投稿(電子情報)

アーカイブ

カテゴリー

浮動小数点データ・bit演算・#defineマクロ

演習も終わった所で、同じプログラムを効率良く記述できることを知ることを 目標に、bit演算や#defineマクロを説明する。

浮動小数点データ

浮動小数点形式のデータは、float,double の2通りがあるが、最近はほとんど double 型で 計算をすれば十分。単精度実数(float)と、その倍の倍精度実数(double)

((float))
S:符号(1bit)
E:指数部(8bit)
F:仮数部(23bit)
SEEE,EEEE,EFFF,FFFF,FFFF,FFFF,FFFF,FFFF
指数部 - 127
float = 1.仮数部 * 2
((double))
S:符号(1bit)
E:指数部(11bit)
F:仮数部(52bit)
SEEE,EEEE...EEEE,FFFF,FFFF,.....,FFFF,FFFF
指数部 - 1023
double = 1.仮数部 * 2

bit演算子

2進数,8進数,16進数の変換プログラムでは、 2,8,16といった数値で割った余りや、商を求めることが多い。 コンピュータ内は2進数で扱っているため、16での余りを求める計算は、 下4bitを取り出したり、16で割るという計算は4ビットシフトに置き換えられる。 そこで、AND(&),OR(|),XOR(^),NOT(~)などのbit演算を説明。

printf( "%d" , 5 & 3 ) ; // 0101 & 0011 = 0001 = 1)10
printf( "%d" , 5 | 3 ) ; // 0101 | 0011 = 0111 = 7)10
printf( "%d" , 5 ^ 3 ) ; // 0101 ^ 0011 = 0110 = 6)10
printf( "%d" , 5 << 2 ) ; // 0101 左2bitシフト = 010100 = 20)10
printf( "%d" , ~10 + 1 ) ; // 反転+1は2の補数 = -10

#defineマクロ

N進数変換のプログラムの中には、下記のような部分があるけど、これを シンプルに書くためには、#defineマクロがよく利用される。

char s[...] ;
if ( '0' <= s[i] && s[i] <= '9' ) ....
#define isdigit(C) ('0' <= (C) && (C) <= '9')
if ( isdigit( s[i] ) ) ...

C言語のプログラムは、最初にプリプロセッサと呼ばれる文字列置換プログラムによって、 #include や、#define の処理が行われる。 #define は、指定された文字を、指定された文字に置換する。 #define マクロは、それを関数的に記載できるようにしたもの。 閉じたサブルーチンと開いたサブルーチンの説明は次回に行う予定。