битовые операции java> shift

почему если

int x = -1 // binary: 11111111111111111111111111111111
x = x >>> 31; 

мы имеем 00000000000000000000000000000001

но если

int x = -1
x = x >>> 32;

у нас есть 11111111111111111111111111111111 (еще -1)

но не 00000000000000000000000000000000 ?

3 ответов


С раздел 15.19 JLS:

если повышенный тип левого операнда-int, только пять в качестве сдвига используются биты нижнего порядка правого операнда расстояние. Это как если правый операнд были подвергнуты побитовая логика и оператор & (§15.22.1) со значением маски 0x1f (0b11111). Фактически используемое расстояние сдвига всегда находится в диапазон 0 to 31, включающий.

выделено мной. Итак:

x >>> n

эквивалентно:

x >>> n & 0x1f  // or x >>> n % 32

и x >>> 32 эквивалентно x >>> 32 & 0x1f x >>> 0 ==x.

так правило всякий раз, когда вы сдвигаете число на несколько 32(int и 32 bits), вы получаете обратно то же значение.


при применении операции битового сдвига учитываются только самые низкие 5 бит правого операнда. Поскольку 32 === 0 / / mod 32, результат не сдвигается.


провел целый день, ломая голову над тем, почему длинный l = i

мое единственное дополнение к ответу Рохита-причина, по которой это так. Из руководства разработчика программного обеспечения Intel Architecture IA-32 3:

8086 не маскирует количество сдвигов. Однако все остальные процессоры IA-32 (начиная с процессора Intel 286) маскируют количество сдвигов до 5 бит, что приводит к максимальному количеству 31. Эта маскировка выполняется во всех режимах работы (включая режим virtual-8086), чтобы сократить максимальное время выполнения инструкций