
C言語でfloat型やdouble型に対してビット演算を行おうとしたところコンパイラに「error: invalid operands to binary & (have ‘float’ and ‘int’)」(要するにそんなことできないぞ)と怒られてしまいました。
そこで解決策を調べたので忘備録として記録しておきます。
float型でbit演算を行うための解決策
まず結論からになりますが、共用体(union)を使用することでこの問題を解決することができました。
typedef union longfloat{
long lnum;
float fnum;
}longfloat;
上記のような共用体をしようすることでfloat型であるlongfloat.fnumに値を入れた後、longfloat.lnumに対してビット演算を行うことであたかもfloat型にbit演算を行ったかのように扱うことができます。
以下にサンプルコードを示します。
floatにビット演算を行うサンプルコード
#include
typedef union longfloat{
long lnum;
float fnum;
}longfloat;
int main(void){
longfloat lfnum = {0};
lfnum.fnum = 1.2345;
printf("fnum:%08lx\n", lfnum.lnum);
lfnum.lnum = lfnum.lnum >> 8;
printf("fnum:%08lx\n", lfnum.lnum);
lfnum.lnum &= 0xFFFF0000;
printf("fnum:%08lx\n", lfnum.lnum);
return 0;
}
出力結果
fnum:3f9e0419
fnum:003f9e04
fnum:003f0000
double型にビット演算を行うサンプルコード
#include
typedef union longlongdouble{
long long llnum;
double dnum;
}longlongdouble;
int main(void){
longlongdouble lldnum = {0};
lldnum.dnum = 1.2345;
printf("fnum:%016llx\n", lldnum.llnum);
lldnum.llnum = lldnum.llnum >> 8;
printf("fnum:%016llx\n", lldnum.llnum);
lldnum.llnum &= 0xFFFFFFFF00000000;
printf("fnum:%016llx\n", lldnum.llnum);
return 0;
}
出力結果
fnum:3ff3c083126e978d
fnum:003ff3c083126e97
fnum:003ff3c000000000