Есть ли способ выполнить циклический сдвиг битов в C #?
-
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 ). Это в основном головоломка без очевидных приложений. В этом видео я продемонстрировал связь между проблемой Иосифа второго порядка и полными сбалансированными деревьями. Это все еще не приложение, но немного движется в правильном направлении.