Ponieważ wiele z istniejących odpowiedzi wskazuje na szczegóły implementacji języka Java i wyniki debugowania, przyjrzyjmy się matematyce stojącej za mnożeniem binarnym, aby naprawdę odpowiedzieć na pytanie, dlaczego.
Komentarz @kasperd idzie w dobrym kierunku. Załóżmy, że nie mnożysz bezpośrednio przez liczbę, ale zamiast tego przez czynniki pierwsze tej liczby. Niż wiele liczb będzie miało 2 jako czynnik pierwszy. W systemie binarnym jest to przesunięcie w lewo. Przez przemienność możemy najpierw pomnożyć przez czynniki pierwsze 2. Oznacza to, że po prostu wykonujemy przesunięcie w lewo.
Patrząc na binarne reguły mnożenia, jedynym przypadkiem, w którym 1 da w wyniku określoną pozycję cyfry, jest sytuacja, w której obie wartości operandów są równe jeden.
Zatem efekt przesunięcia w lewo jest taki, że najniższe położenie bitu 1 przy dalszym mnożeniu wyniku jest zwiększane.
Ponieważ liczba całkowita zawiera tylko bity najniższego rzędu, wszystkie zostaną ustawione na 0, gdy w wyniku dostatecznie często występuje czynnik pierwszy 2.
Zauważ, że reprezentacja dopełnienia do dwóch nie jest interesująca dla tej analizy, ponieważ znak wyniku mnożenia można obliczyć niezależnie od wynikowej liczby. Oznacza to, że jeśli wartość przepełni się i stanie się ujemna, bity najniższego rzędu są reprezentowane jako 1, ale podczas mnożenia są ponownie traktowane jako 0.