부분적으로 7 년 후에이 질문에 대답하기 위해 이동합니다.
.Net에서 ROR/ROL을 사용할 수 있습니다.
MSIL에는 ROR 또는 ROL 연산이 직접 포함되지 않지만 JIT 컴파일러에서 ROR 및 ROL을 생성하는 패턴이 있습니다. RuyJIT (.Net 및 .Net 코어)는이를 지원합니다.
이 패턴을 사용하기위한 .Net Core의 개선 내용은 discussed here이며 1 개월 후 .Net Core code는 updated to use it입니다.
우리가 ROR의 예를 찾아 implementation of SHA512에서 상대 :
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를 사용하여 "캐리"를 추출하고 대상을 지우고 OR을 적용합니다. 이것은 양방향으로 미러링되어야합니다 (낮음 - 높음 및 높음 - 낮음). 나는이 질문이 약간 낡았 기 때문에 예제로 귀찮게하지 않을 것이다.
비트 순환을위한 CIL 연산 코드가 없더라도 JIT 컴파일러는 여전히 여러 CIL 연산 코드를 기본 시스템의 명령어 세트에있는 ROL 및 ROR 명령어에 매핑 할만큼 똑똑 할 수 있습니다. (실제로 JIT 컴파일러가 똑똑하다고 생각하지 않지만 적어도 가능합니다.) 나는 말하고 싶다 : 나는 너무 많이 걱정하지 않을 것이다. 실제 어셈블리 언어에 비해 CIL 코드는 매우 비효율적 인 것처럼 보이지만 JIT 컴파일러는이를 다소 완화 할 것입니다. – stakx