code-1839406_640


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