ぱぱっと書かせるプログラムの問題、の続き?の件
れいさん、すごいですね。
ソース再掲(※ちょっと書き直しました)
bool isAPo2(int num)
{
union
{
DWORD dw[2];
double dbl;
} data;
if (num == 0)
return false;
data.dbl = (double)num;
return ( (data.dw[0] == 0) && ((data.dw[1] & 0xfffff) == 0));
}
処理としては入力をdoubleに変換して、仮数部が0かどうかを判断しています。
浮動小数点形式に関してはIEEE754でぐぐるとなんぼでもでてきますが、浮動小数点形式に変換するというのは「1.*** × 2n」の形式に変換することであり、2の乗数だと仮数部がぴったり1.0000…になります。で、内部形式上、最初の1は省略するので、仮数部が0かどうかで、もとの数字が2の乗数かどうかわかるというわけです。
おそまつm(__)m