|
■No91851 (えん さん) に返信
> VBでもビットシフトを使えるのは分かりますが、
> 不慣れなせいかわかりづらいので、これを使わない方法に書き換えました。
元の C++ コードを C# に置き換えて
int n = 32768;
int m, mq;
for (m = n; (mq = m >> 2) >= 1; m = mq)
{
Console.WriteLine("m={0,7:N0}, mq={1,7:N0}", m, mq);
}
として実行してみたところ
m= 32,768, mq= 8,192
m= 8,192, mq= 2,048
m= 2,048, mq= 512
m= 512, mq= 128
m= 128, mq= 32
m= 32, mq= 8
m= 8, mq= 2
という結果になりました。
また、No91850 の実装なら、元の C++/C# 版と同じ結果が得られました。
一方、御提示頂いた No91848 の意訳実装で
Dim n = 32768
Dim m As Integer = n
For g As Integer = 1 To CInt(Math.Log(n, 4))
'
Console.WriteLine("m={0,7:N0} =>", m)
'
m = CInt(m / 4)
Dim mq As Integer = CInt(m / 4)
'
Console.WriteLine("m={0,7:N0}, mq={1,7:N0}", m, mq)
'
Next g
とした場合、出力結果はこうなりますね。ループ回数が変化しています。
m= 32,768 => m= 8,192, mq= 2,048
m= 8,192 => m= 2,048, mq= 512
m= 2,048 => m= 512, mq= 128
m= 512 => m= 128, mq= 32
m= 128 => m= 32, mq= 8
m= 32 => m= 8, mq= 2
m= 8 => m= 2, mq= 0
m= 2 => m= 0, mq= 0
|