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

Som*_*ame 13 c bitwise-operators

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

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

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

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

Cla*_*dix 6

我认为这是因为有两种类型的旋转:有和没有进位,根据生成的机器的CARRY标志(1或0),可以不同地进行旋转.这意味着实现总共4个操作符,从而使语言不必要地复杂化,前提是可以像@Aniket所示简单地实现旋转.

编辑:

然而,转移也可以签名和签名.实际上Javascript有两个运营商,AFAIK.但是,由于C支持有符号和无符号变量,我认为执行有符号的移位是没有意义的,因为编译器应该知道我们是否正在移位有符号或无符号变量.有符号/无符号移位对于算术计算很有用,C编译器可以使用它们来生成汇编代码.例如,许多算术运算,例如乘以或除以2的幂,由编译器转换为移位运算.我们在C中使用移位运算符的唯一原因是使用位掩码.


Ani*_*nge 1

C 没有二进制的左旋转和右旋转。您可以自己编写向左旋转和向右旋转函数的代码。但按照标准:不。

简单的左旋转:

int rotate_left(int num, int bits)
{
  return ((num << bits) | (num >> (32 -bits)));
} 

int rotate_right(int num, int bits)
{
  return ((num >> bits) | (num << (32 -bits)));
}
Run Code Online (Sandbox Code Playgroud)

上述函数仅适用于 32 位整数:)

现在来说说它的哲学:C 的目的是尽可能地可移植。这就是标准团队希望它成为“便携式汇编器”的原因。无法保证 rol 和 ror 会出现在未来的架构中。或者可能表现不同。因此它远离标准。

  • 该代码中潜伏着许多未定义的行为,左移负整数是 UB,如果“value * 2^shift”在类型中无法表示,则非负值的有符号整数左移是 UB。负整数的右移是实现定义的,并且通常会进行符号扩展,因此它们实际上不会旋转。让它们对无符号整数进行操作,你唯一的问题就变成了移位距离必须为非负且小于类型宽度的约束(“bits &amp;= 31”,如果“bits == 0”,则返回数)。 (6认同)
  • @GrijeshChauhan:**不!** (4认同)
  • 很好,但实际的问题是“有人知道为什么语言中不包含向左旋转/向右旋转吗?” ` (3认同)