Подтвердить что ты не робот

Почему C не вращает операторы влево/вправо?

Немного философский вопрос, я полагаю.

В языке C имеется стандартный набор бит-операций, включая OR, AND, XOR, SHIFT LEFT/RIGHT и NOT. Почему не вращать левые/вращать правильные операторы или функции, включенные в язык?

Эти операторы имеют одинаковую сложность, чем другие битовые операторы, и обычно требуется одна инструкция сборки, как и другие. Кроме того, я могу придумать множество применений для оператора rotate, возможно, не менее, скажем, оператора XOR, поэтому мне кажется немного странным, что они не включены в C вместе с остальными.

Если вам нужно повернуть на C или С++, есть отдельный вопрос о наиболее подходящих для него вопросах. Обсуждение этого вопроса вне темы для этого вопроса.

4b9b3361

Ответ 1

Я думаю, это потому, что есть два типа поворотов: с и без переноса, что заставляет вращение делать по-другому, в соответствии с полученным флагом CARRY машины (1 или 0). Это означало бы внедрение в общей сложности 4 операторов, что сделало бы язык излишне сложным, при условии, что поворот можно просто реализовать, как показал @Aniket.

ИЗМЕНИТЬ

Тем не менее, сдвиг также может выполняться как подписанный, так и беззнаковый. На самом деле Javascript имеет обоих операторов, AFAIK. Однако, поскольку C поддерживает подписанные и неподписанные переменные, я думаю, что нет смысла выполнять подписанные смены, потому что компилятор должен знать, переносим ли мы переменную с подписью или без знака. Подписанные/неподписанные сдвиги полезны для арифметических вычислений, и компилятор C может использовать их для генерации кода сборки. Например, многие арифметические операции, такие как умножение или деление на мощность 2, переводятся компилятором в операции сдвига. Единственная причина, по которой мы имеем операторы сдвига в C, - работать с битмашками.

Ответ 2

C не имеет поворота-левого и поворот-право для двоичного. Вы можете самостоятельно повернуть поворот влево и повернуть-право. Но по стандартам: нет.

Простой поворот-левый:

int rotate_left(int num, int bits)
{
  return ((num << bits) | (num >> (32 -bits)));
} 

int rotate_right(int num, int bits)
{
  return ((num >> bits) | (num << (32 -bits)));
}

Вышеуказанные функции будут работать только с 32-битными целыми числами:)

Теперь для философии: C должен был быть максимально переносимым. Это то, что команда стандартов хочет, чтобы он был "переносным ассемблером". Нет гарантии, что rol and ror присутствует на архитектурах будущего. Или может вести себя по-другому. Следовательно, он был вдали от стандартов.