これは、プログラミングの問題ではなく、言語設計の問題です。
以下は、 JLS 15.19 Shift Operatorsからの抜粋です。
左側のオペランドの昇格された型が の場合、
int
右側のオペランドの下位 5 ビットのみがシフト距離として使用されます。左側のオペランドの昇格された型が の場合、
long
右側のオペランドの下位 6 ビットのみがシフト距離として使用されます。
この動作はC# でも指定されており、Javascript の公式仕様 (存在する場合) に含まれているかどうかはわかりませんが、少なくとも私自身のテストに基づいても当てはまります。
その結果、次のことが成り立ちます。
(1 << 32) == 1
この仕様は、基盤となるハードウェアが 32 ビット値をシフトするときにカウント オペランドに 5 ビット (および 64 ビットの場合は 6 ビット) しか使用しないという事実におそらく「触発された」ものであることを理解しています。たとえば、JVM レベルですが、C# や Java などの高レベル言語がこの低レベルの動作を維持するのはなぜでしょうか? ハードウェアの実装を超えた抽象的なビューを提供し、より直感的に動作するべきではないでしょうか? (他の方向にシフトすることを意味する負の数を取ることができればさらに良いです!)