2016-01-21 3 views

ответ

2

Из-за того, как >> работ. >> не «разделяет на 2», он просто заканчивается тем же ответом для определенных ситуаций. Например, по 8-битным значениям:

3 is 0b00000011; правый сдвиг на один бит равен 0b00000001, что составляет 1.

-3 - 0b11111101; правый сдвиг на один бит равен 0b11111110, или -2.

Однако интегральное разделение / в Java определяется всегда округление к нулю - так (-3)/2 становится -1 (как это ближе к 0 чем -2 есть).

EDIT: комментарии относятся к моему мозгу в переключении >> и >>> вокруг.

+1

Я тестировал это в c и -3 >> 1 = -2. Согласно http://www.cs.mun.ca/~michael/c/op.html, «>> возвращает expr1 сдвинутые правые выражения expr2, если тип выражения expr1 подписан, 1 бит сдвинут в высокий биты порядка, иначе 0 бит сдвинуты. Математически эквивалентно expr1/2expr2. " Они кажутся ошибочными в том, что они математически эквивалентны, но смещение в 0 или 1 в зависимости от знака кажется правильным. –

+0

@TonyRuth: Ваш источник ошибочен. Не существует определенного определения [целочисленного деления] (https: //en.wikipedia.org/wiki/Division_ \ (математика \) #Of_integers), если дивиденд не делится на делитель; так как операторы '/' и operator '>>' * * определены как *, они явно не * математически * эквивалентны. Кроме того, вы говорите о C; Я прямо рассматриваю языковые несовместимости в моем последнем абзаце. – Amadan

+0

, когда я тестирую в java '-3 >> 1 = -2'. –