左右移位运算符(<<和>>)已在C++中可用.但是,我无法找到如何执行循环移位或旋转操作.
如何执行"向左旋转"和"向右旋转"等操作?
在这里向右旋转两次
Initial --> 1000 0011 0100 0010
Run Code Online (Sandbox Code Playgroud)
应该导致:
Final --> 1010 0000 1101 0000
Run Code Online (Sandbox Code Playgroud)
一个例子会有所帮助.
(编者注:如果旋转计数为零,许多常见的表达方式在C中旋转会受到未定义的行为的影响,或者编译为不止一个旋转机器指令.这个问题的答案应记录最佳实践.)
我有一段时间试图提出一个不违反C/C++标准的恒定时间旋转.
问题是边缘/角落情况,其中操作在算法中被调出并且那些算法不能被改变.例如,以下内容来自Crypto ++并执行GCC ubsan(即g++ fsanitize=undefined)下的测试工具:
$ ./cryptest.exe v | grep runtime
misc.h:637:22: runtime error: shift exponent 32 is too large for 32-bit type 'unsigned int'
misc.h:643:22: runtime error: shift exponent 32 is too large for 32-bit type 'unsigned int'
misc.h:625:22: runtime error: shift exponent 32 is too large for 32-bit type 'unsigned int'
misc.h:637:22: runtime error: shift exponent 32 is too large for 32-bit type 'unsigned int'
misc.h:643:22: runtime error: shift exponent 32 is …Run Code Online (Sandbox Code Playgroud) 我想,这是一个哲学问题.
C语言有一组标准的逐位运算的,其中包括OR,AND,XOR,SHIFT LEFT/RIGHT,和NOT.为什么不旋转左/右旋转操作符或语言中包含的函数?
这些运算符与其他逐位运算符具有相同的复杂性,并且通常需要单个汇编指令,就像其他运算符一样.此外,我可以想到旋转运算符的很多用途,可能不会比xor运算符少 - 所以对我来说听起来有些奇怪,它们不包括在C中.
如果您确实需要使用C或C++进行旋转,那么有关于它的最佳实践的单独常见问题解答.关于这个问题的讨论是偏离主题的.