「num」はしばらくの間0になるのはなぜですか?C#For Loop Confusion
int num = 16;
for (int i = 1; i < 1000; i++)
{
Console.WriteLine(num *= i);
}
「num」はしばらくの間0になるのはなぜですか?C#For Loop Confusion
int num = 16;
for (int i = 1; i < 1000; i++)
{
Console.WriteLine(num *= i);
}
乗算の結果が大きくなりすぎたときには、int
の容量をオーバーフローしているため。
'long 'は0になるのに少し時間がかかりませんか? –
@ScottHunterはい、それもゼロになります。おそらくさらに早くなります。 – DavidG
@ScottHunter 'long'は' int'より大きい_aロット_です。とにかく '0'に行くと、' System.Numerics'の 'BigInteger'クラスが役に立ちます。 –
毎回i
が2の倍数である場合、それによってn
を掛けて、n
が多く、最後に0
ビットが与えられます。最終的には変数を埋めて0にします。
それは2の力だけではなく、 "左シフト"よりも、私の答えを見てください。 (ちょうど偶数でなければならない) – DavidG
@DavidG:良いキャッチ。 –
31回目の反復では、num
は既に理解しているオーバーフローのために-1073741824
になります。
次の(32番目)反復では、num
に32
(これはバイナリとしてb100000
)を掛けます。この乗算は、値5ビットを左にシフトすることと同じです。
-1073741824
は0xC0000000
あり、そしてあなたが左に5ビットのことをシフトすれば、あなたの32ビット値は0x00000000
=>ゼロなってしまいます。
この質問のすべての部分を結びつけるうまい方法! –
偶数で乗算するたびに、数字の右側に1つ以上のバイナリのゼロを追加しますが、は決してを削除します。最終的に、すべての桁がゼロである点にヒットします。
01: 10000 <= 4 zeros
02: 100000 <= 5 zeros
03: 1100000 <= 5 zeros
04: 110000000 <= 7 zeros
05: 11110000000 <= 7 zeros
06: 10110100000000 <= 8 zeros
07: 10011101100000000 <= 8 zeros
08: 10011101100000000000 <= 11 zeros
09: 10110001001100000000000 <= 11 zeros
10: 11011101011111000000000000 <= 12 zeros
11: 100110000100010101000000000000 <= 12 zeros
12: 11001000110011111100000000000000 <= 14 zeros
13: 110010100011001100000000000000 <= 14 zeros
14: 11000011101100101000000000000000 <= 15 zeros
15: 1110111011101011000000000000000 <= 15 zeros
16: 1110111010110000000000000000000 <= 19 zeros
17: 11101100110110000000000000000000 <= 19 zeros
18: 10100111001100000000000000000000 <= 20 zeros
19: 1101000100100000000000000000000 <= 20 zeros
20: 101011010000000000000000000000 <= 22 zeros
21: 10001100010000000000000000000000 <= 22 zeros
22: 1101100000000000000000000000 <= 23 zeros
23: 110110100000000000000000000000 <= 23 zeros
24: 11100000000000000000000000000 <= 26 zeros
25: 10111100000000000000000000000000 <= 26 zeros
26: 11000000000000000000000000000 <= 27 zeros
27: 10001000000000000000000000000000 <= 27 zeros
28: 11100000000000000000000000000000 <= 29 zeros
29: 1100000000000000000000000000000 <= 29 zeros
30: 1000000000000000000000000000000 <= 30 zeros
31: 11000000000000000000000000000000 <= 30 zeros
それが0になる前に、値が '取るnum'どういう:
これはあなたが得る配列であり、右側がしかゼロの数字の長い列を取得することに注意してください? –
各操作を1行ずつ調べます。手作業で作業を行い、なぜそれが終わっているのかが分かります。 – Servy
@DavidG - これは適切な答えです:)自分自身を投稿しようとしていた。あなたが投稿する価値があります:) –