Есть ли способ выполнить круговое смещение бита в С#?
Я знаю, что верно следующее
int i = 17; //binary 10001
int j = i << 1; //decimal 34, binary 100010
Но, если вы слишком сильно смещаетесь, бит падает с конца. Где это происходит, речь идет о размере целого числа, с которым вы работаете.
Есть ли способ выполнить смену так, чтобы бит вращался вокруг к другой стороне? Я ищу одну операцию, а не цикл for.
Ответы
Ответ 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;
}
Было бы легко расширить его для любого заданного размера.
Ответ 4
Я должен признать, что я просто выполнил поиск для "С# bit rotate" и нашел ссылку на страницу с классом Java, которая была бы легко адаптирован к С#
Я также нашел это в книге Google, которая является функцией С++ с аналогичным поведением
Ответ 5
Самое известное приложение - это решение проблемы Джозефуса (как описано в "Конкретной математике", см. http://oeis.org/A006257). Это в основном головоломка без очевидных приложений. В это видео, я продемонстрировал связи между проблемой второго порядка Иосифа и полными сбалансированными деревьями. Это все еще не приложение, но слегка двигающееся в правильном направлении.