битовые операции java> shift
почему если
int x = -1 // binary: 11111111111111111111111111111111
x = x >>> 31;
мы имеем 00000000000000000000000000000001
но если
int x = -1
x = x >>> 32;
у нас есть 11111111111111111111111111111111 (еще -1)
но не 00000000000000000000000000000000 ?
3 ответов
если повышенный тип левого операнда-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), чтобы сократить максимальное время выполнения инструкций