Есть ли способ выполнить циклический сдвиг битов в C #?

StackOverflow https://stackoverflow.com/questions/35167

  •  09-06-2019
  •  | 
  •  

Вопрос

Я знаю, что верно следующее

int i = 17; //binary 10001
int j = i << 1; //decimal 34, binary 100010

Но если вы сдвинете его слишком далеко, кусочки отвалятся от конца.Где это происходит, зависит от размера целого числа, с которым вы работаете.

Есть ли способ выполнить сдвиг так, чтобы биты вращались в другую сторону?Я ищу единственную операцию, а не цикл for.

Это было полезно?

Решение

Если вы знаете размер шрифта, вы могли бы сделать что-то вроде:

uint i = 17;
uint j = i << 1 | i >> 31;

...который выполнял бы циклический сдвиг 32-битного значения.

В качестве обобщения для циклического сдвига влево на n бит, для переменной b бит:

/*some unsigned numeric type*/ input = 17;
var result = input  << n | input  >> (b - n);


@Комментарий, похоже, что C # действительно по-разному обрабатывает старший бит подписанных значений.Я нашел кое-какую информацию по этому поводу здесь.Я также изменил пример, чтобы использовать uint.

Другие советы

Год назад я внедрил MD4 для своей магистерской работы. Вот моя реализация кругового сдвига битов с использованием UInt32.

private UInt32 RotateLeft(UInt32 x, Byte n)
{
      return UInt32((x << n) | (x >> (32 - n)));
}

Так же, как справка о том, как это сделать, эти две функции отлично работают для вращения битов 1 / 2word:

static public uint ShiftRight(uint z_value, int z_shift)
{
    return ((z_value >> z_shift) | (z_value << (16 - z_shift))) & 0x0000FFFF;
}

static public uint ShiftLeft(uint z_value, int z_shift)
{
    return ((z_value << z_shift) | (z_value >> (16 - z_shift))) & 0x0000FFFF;
}

Было бы легко расширить его до любого заданного размера.

Должен признать, я только что выполнил поиск "C # bit rotate" и нашел ссылку на страницу с классом Java, которая будет легко адаптирована для C # ‹ результат "rel =" nofollow noreferrer "> Я также нашел это в Google Книге, которая является функцией C ++ с похожим поведением

Самым известным приложением является решение проблемы Джозефуса (как обсуждалось в «Конкретной математике», см. http://oeis.org / A006257 ). Это в основном головоломка без очевидных приложений. В этом видео я продемонстрировал связь между проблемой Иосифа второго порядка и полными сбалансированными деревьями. Это все еще не приложение, но немного движется в правильном направлении.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top