Чтобы частично ответить на этот вопрос 7 лет спустя, на тот случай, если кому-то это понадобится.
Вы можете использовать ROR / ROL в .Net.
MSIL напрямую не содержит ROR или ROLопераций, но есть шаблоны, которые заставят JIT-компилятор генерировать ROR и ROL.RuyJIT (ядро .Net и .Net) поддерживает это.
Подробности улучшения .Net Core для использования этого шаблона обсуждались здесь , а месяцем позже .Net Core был обновлен, чтобы использовать его .
Рассматривая реализацию SHA512 , мы находим примеры ROR:
public static UInt64 RotateRight(UInt64 x, int n) {
return (((x) >> (n)) | ((x) << (64-(n))));
}
И расширяем по той же схеме до ROL:
public static UInt64 RotateLeft(UInt64 x, int n) {
return (((x) << (n)) | ((x) >> (64-(n))));
}
Чтобы сделать это для 128-разрядного целого числа, вы можете обработать как два 64-разрядных, затем AND для извлечения «переноса», AND для очистки места назначения и OR для применения.Это должно быть отражено в обоих направлениях (низкий-> высокий и высокий-> низкий).Я не собираюсь возиться с примером, так как этот вопрос немного стар.