ゆき社長

シーゲンガーのお勉強 ゲームプログラマ、ゲーマー、色々!

if( A & 0x00ffffff == B & 0x00ffffff )

先輩のソースみてたら

if( A & 0x00ffffff == B & 0x00ffffff )

って書いてあった。やりたい事は、下位24ビットのみで イコール判定

でもなんか 違和感感じた

頭の古いわたしには

if((A^B) & 0x00ffffff )

ってソースが一番に浮かぶ

if((A-B) & 0x00ffffff )

は、ダメだと思う多分。符号とか考えると

if( A & 0x00ffffff == B & 0x00ffffff )

が、可視性が高いが、

if((A^B) & 0x00ffffff )

の方が 感覚的に速いが、コンパイラの最適化でどうなるか?

って事で 最適化オプションつけて アセンブラ比較 in VisualStudio2010 Pro

;if( A & 0x00ffffff == B & 0x00ffffff )

mov edx,dword ptr [A]

mov ecx,word ptr [B]

and edx,0FFFFFFh

mov eax,r13d ; eax <- 0

cmp edx,ecx

sete al

test eax,0FFFFFFh

jne hoge

;if((A^B) & 0x00ffffff )

mov ecx,word ptr [A]

xor ecx,dword ptr [B]

test ecx,0FFFFFFh

jne hoge

おまけ

;if((A-B) & 0x00ffffff )

mov ecx,word ptr [A]

mov eax,dword ptr [B]

sub eax,ecx

test eax,0FFFFFFh

jne hoge

if((A^B) & 0x00ffffff )

が速いし アセンブラレベルだと可視性が高い

やはり アセンブラの最適化はすごいが、感覚的に速いコードの方が速い事が多いね