2015-04-07 3 views
0

Насколько я понимаю, результат сдвига положительного целого влево от 1 такого же, как умножить его на два (если это не переполнение)Java: смещение отрицательного числа

Что произойдет. к отрицательному целому числу?

Is x < < 1 всегда равно x * 2, если он не переполняется?

Я пробовал:

int num = -1; 
for (int i= 0; i < 32; i++){ 
    System.out.println(num << i); 
} 

Он печатает

-1 
-2 
-4 
-8 
-16 
-32 
-64 
-128 
-256 
-512 
-1024 
-2048 
-4096 
-8192 
-16384 
-32768 
-65536 
-131072 
-262144 
-524288 
-1048576 
-2097152 
-4194304 
-8388608 
-16777216 
-33554432 
-67108864 
-134217728 
-268435456 
-536870912 
-1073741824 
-2147483648 
+5

Это выглядит, как вы» вы уже ответили на свой вопрос .. –

+0

Спасибо за редактирование. Поэтому я предполагаю, что это всегда так? не только для -1. –

+0

@BrendanLong Он ответил только за (отрицательные) полномочия 2 – assylias

ответ

4

Да, немного сдвига влево на 1 всегда эквивалентно умножению на 2 (за исключением переполнения). JLS, Section 15.19, даже говорит так:

Значение п < < с п является сдвинуты влево с позиции битов; это эквивалентно (даже если происходит переполнение) для умножения на два на степень s.

Я думаю, что JLS утверждает «даже если происходит переполнение», потому что это эквивалентно операции умножения, которая также может переполняться.

1

Это немного смещения, вы должны смотреть на то, что происходит с битами: -1 0xFFFFFFFF, после того, как 1 битном сдвиг влево, мы получим 0xFFFFFFFE это -2, и т.д.