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

Есть ли способ выполнить круговое смещение бита в С#?

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

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

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

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

4b9b3361

Ответ 1

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

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);

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 5

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