仅使用C中的按位运算符向右旋转n

krb*_*686 2 c bit-manipulation rotation

我试图通过仅使用按位运算符在C中实现rotateRight by n函数.

到目前为止,我已经决定使用它了.

y = x >> n
z = x << (32 - n)

g = y | z
Run Code Online (Sandbox Code Playgroud)

所以以价值为例 11010011

如果我试着`rotateRight(5):

y11111110

z01100000

然后g成为111111110

但是应该是正确的答案 10011110

这几乎可以工作,但问题是当我需要它来执行逻辑移位时右移复制符号位,所以我的一些答案是他们应该是什么的负面.我怎样才能解决这个问题?

注意 我无法使用强制转换无符号类型

jla*_*ahd 6

您可以转移无符号值:

y = (int)((unsigned)x >> n);
z = x << (32 - n);
g = y | z;
Run Code Online (Sandbox Code Playgroud)

或者,您可以适当地掩盖:

y = (x >> n) & ~(-1 << (32 - n));
z = x << (32 - n);
g = y | z;
Run Code Online (Sandbox Code Playgroud)

  • 你的答案是正确的,正是我想说的,但我会请你详细说明,因为他似乎是一个初学者.我会假设他不理解*shift right*和*shift arithmetic right*之间的区别,并倾向于提供关于它们的文章的链接,并在答案中包含一个关于`int`和`unsigned int`的解释.在那里发挥作用. (2认同)