>>>
- логический логический сдвиг вправо в Java .
Он сдвигается в ноль слева, а не сохраняет знаковый бит.Автор поста в блоге даже предлагает реализацию на C ++:
mid = ((unsigned int)low + (unsigned int)high)) >> 1;
... если вы сдвигаете вправо числа без знака, сохранение знака не имеет смысла (поскольку есть без знакового бита), поэтому компилятор, очевидно, использует логические сдвиги, а не арифметические.
Приведенный выше код использует MSB (32-разрядный, предполагающий 32-разрядные целые числа): добавление low
и high
оба являются неотрицательными целыми числами и, таким образом, помещаются в 31 бит , никогда не переполняет полные 32 бита, но распространяется на MSB.При смещении вправо 32-битное число эффективно делится на два, а 32-й бит очищается снова, поэтому результат является положительным.
Правда в том, что оператор >>>
в Java - это просто обходной путь для того факта, что язык не предоставляет unsigned
типов данных.