Есть ли способ выполнить круговой битовый сдвиг в C #? - PullRequest
34 голосов
/ 29 августа 2008

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

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

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

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

Ответы [ 5 ]

48 голосов
/ 29 августа 2008

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

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.

10 голосов
/ 09 октября 2008

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

private UInt32 RotateLeft(UInt32 x, Byte n)
{
      return UInt32((x << n) | (x >> (32 - n)));
}
3 голосов
/ 25 июня 2009

Так же, как справка о том, как это сделать, эти две функции отлично работают для вращения битов 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;
}

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

0 голосов
/ 29 мая 2011

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

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