相关疑难解决方法(0)

C++中循环移位(旋转)操作的最佳实践

左右移位运算符(<<和>>)已在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++ bit-manipulation c++-faq rotation

84
推荐指数
9
解决办法
10万
查看次数

接近恒定时间旋转,不违反标准

我有一段时间试图提出一个不违反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++ bitwise-operators undefined-behavior constant-time

25
推荐指数
2
解决办法
4679
查看次数

为什么C不能旋转左/右操作符?

我想,这是一个哲学问题.

C语言有一组标准的逐位运算的,其中包括OR,AND,XOR,SHIFT LEFT/RIGHT,和NOT.为什么不旋转左/右旋转操作符或语言中包含的函数?

这些运算符与其他逐位运算符具有相同的复杂性,并且通常需要单个汇编指令,就像其他运算符一样.此外,我可以想到旋转运算符的很多用途,可能不会比xor运算符少 - 所以对我来说听起来有些奇怪,它们不包括在C中.

如果您确实需要使用C或C++进行旋转,那么有关于它的最佳实践的单独常见问题解答.关于这个问题的讨论是偏离主题的.

c bitwise-operators

13
推荐指数
2
解决办法
9679
查看次数