制作日記

こういうの作った方が、逃げにくいじゃない

整数での**の計算結果がおかしくなる理由

分かった

問題の処理は記事の最後に載せてる辺り

やりたいことは、多分上から計算していく感じ?

X乗するとして、Xが2以上ならまず2(2進数で10)乗

Xを2進数としたとき上から2桁目が1なら、一番初めの値をかけて3(2進数で11)乗にする

Xが3以下なら終了、それより大きければ計算した値を2乗する

これで2乗していた場合はは4(2進数で100)乗、3乗していた場合は6(110)乗したことになる

Xを2進数としたとき上から3桁目が1なら、
一番初めの値をかけて5(2進数で101)乗、もしくは7(2進数で111)乗にする

Xが7以下なら終了、それより大きければ計算した値を更に2乗する

てな感じ?

で、この一番初めの値をかけるかどうかの判定が間違ってて、
上の桁から判定するべきなのに下の桁から判定していってる

だから、最上位桁以外反転した数で累乗計算してしまうわけだ

標準関数のpow()は遅いから、独自に整数専用の累乗計算の関数作ったんだろうねー
for()で回せばいいのに、下手な小細工しちゃうから……

直せそうなら直そうと思ったけど、シーケンスそのままってのは無理
シーケンス変えるのは怖い、というか出力結果が変わるのが恐ろしい……
**以外で使ってる可能性もあるから、他への影響もわからないし

一応直したけど、上記の理由から動作は保証しない

winmugen.ico


00407CF3 8BC8 MOV ECX,EAX
00407CF5 BD 01000000 MOV EBP,1
00407CFA 0FAFC1 IMUL EAX,ECX
00407CFD 8D4A FF LEA ECX,DWORD PTR DS:[EDX-1]
00407D00 D3E5 SHL EBP,CL
00407D02 85EF TEST EDI,EBP
00407D04 74 03 JE SHORT winmugen.00407D09
00407D06 0FAFC3 IMUL EAX,EBX
00407D09 42 INC EDX
00407D0A BD 01000000 MOV EBP,1
00407D0F 8BCA MOV ECX,EDX
00407D11 D3E5 SHL EBP,CL
00407D13 3BFD CMP EDI,EBP
00407D15 ^7D DC JGE SHORT winmugen.00407CF3

コメントの投稿

非公開コメント

プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク