Что такое >>> работа в C ++ - PullRequest
7 голосов
/ 03 апреля 2011

В этом сообщении в блоге автор предложил в качестве исправления ошибки следующее:

 int mid = (low + high) >>> 1;

Кто-нибудь знает, что это за оператор >>>?Конечно, его нет в следующем списке операторов:

Что это такое и как это решаетпроблема переполнения?

Ответы [ 6 ]

8 голосов
/ 03 апреля 2011

>>> не является частью C ++. Блог содержит код на Java.

Ознакомьтесь с онлайн-учебником по Java здесь по операторам побитового сдвига. Это говорит

Оператор сдвига без знака ">>>" смещает ноль в крайнее левое положение, а крайнее левое положение после ">>" зависит от расширения знака.

3 голосов
/ 03 апреля 2011

Оператор >>> находится во фрагменте кода Java , и это оператор беззнакового смещения вправо .Он отличается от оператора >> обработкой значений со знаком: оператор >> применяет расширение знака во время сдвига, в то время как оператор >>> просто вставляет ноль вбитовые позиции, «очищенные» сдвигом.

К сожалению, в C ++ нет такого понятия, как сохранение знака и беззнаковое смещение вправо, у нас есть только оператор >>, чье поведение на отрицательных знаковых значениях - реализация-определенной.Чтобы эмулировать поведение, аналогичное >>>, вы должны выполнить несколько приведений к unsigned int перед применением сдвига (как показано в фрагменте кода сразу после того, который вы опубликовали).

2 голосов
/ 03 апреля 2011

>>> - логический логический сдвиг вправо в Java .

Он сдвигается в ноль слева, а не сохраняет знаковый бит.Автор поста в блоге даже предлагает реализацию на C ++:

mid = ((unsigned int)low + (unsigned int)high)) >> 1;

... если вы сдвигаете вправо числа без знака, сохранение знака не имеет смысла (поскольку есть без знакового бита), поэтому компилятор, очевидно, использует логические сдвиги, а не арифметические.

Приведенный выше код использует MSB (32-разрядный, предполагающий 32-разрядные целые числа): добавление low и high оба являются неотрицательными целыми числами и, таким образом, помещаются в 31 бит , никогда не переполняет полные 32 бита, но распространяется на MSB.При смещении вправо 32-битное число эффективно делится на два, а 32-й бит очищается снова, поэтому результат является положительным.

Правда в том, что оператор >>> в Java - это просто обходной путь для того факта, что язык не предоставляет unsigned типов данных.

2 голосов
/ 03 апреля 2011

>>> не является оператором C ++.Я думаю, что это оператор на языке Java.Я не уверен, хотя!

РЕДАКТИРОВАТЬ:

Да.Это оператор Java.Проверьте ссылку на статью, которую вы предоставили.В статье используется язык Java!

1 голос
/ 03 апреля 2011

Выражение Java x >>> y более или менее эквивалентно выражению C ++ unsigned(x) >> y.

1 голос
/ 03 апреля 2011

Это Java-оператор, не связанный с C ++.

Однако все, что делает автор блога, это изменяет деление на 2 с побитовым сдвигом вправо (т.е. сдвиг вправо значения на 1 аналогичен делению на 2 ^ 1).

Та же функциональность, различный вывод машинного кода (операции смещения битов почти всегда выполняются быстрее, чем умножение / деление на большинстве архитектур).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...