Pour répondre en partie à cette question 7 ans plus tard, au cas où quelqu'un devrait en avoir besoin.
Vous pouvez utiliser ROR/ROL dans .Net. MSIL ne contient pas directement les opérations ROR ou ROL, mais il existe des modèles qui permettront au compilateur JIT de générer ROR et ROL. RuyJIT (.Net et .Net core) supporte cela.
Les détails de l'amélioration. Net Core pour utiliser ce modèle était discussed here et un mois plus tard. Le code de base de .Net était updated to use it.
En regardant le implementation of SHA512 nous trouvons des exemples de ROR:
public static UInt64 RotateRight(UInt64 x, int n) {
return (((x) >> (n)) | ((x) << (64-(n))));
}
et extension par même modèle ROL:
public static UInt64 RotateLeft(UInt64 x, int n) {
return (((x) << (n)) | ((x) >> (64-(n))));
}
Pour ce faire sur entier 128 bits vous pouvez traiter comme deux 64 -bit, puis ET pour extraire "carry", ET pour effacer la destination et OU pour appliquer. Cela doit être reflété dans les deux directions (basse -> haute et haute - basse). Je ne vais pas m'embêter avec un exemple puisque cette question est un peu ancienne.
Même s'il s'avère qu'il n'existe pas de code op CIL pour les rotations de bits, le compilateur JIT peut encore être assez intelligent pour mapper plusieurs op-codes CIL aux instructions ROL et ROR sur l'ensemble d'instructions de la machine sous-jacente. (Je ne pense pas que le compilateur JIT soit * intelligent *, mais au moins c'est possible). Je veux dire: je ne m'inquiéterais pas trop. Comparé au langage d'assemblage réel, le code CIL semble très inefficace de toute façon, mais le compilateur JIT le soulagera probablement un peu. – stakx