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

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

C语言具有标准的逐位操作集,包括ORANDXORSHIFT LEFT/RIGHTNOT 。 为什么不旋转左/右旋转操作符或语言中包含的函数?

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

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

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

编辑

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

对于二进制,C没有向左旋转和向右旋转。 您可以自己编码左旋和右旋function。 但按照标准:不。

简单的左旋:

 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))); } 

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

现在的理念是:C意味着尽可能便携。 这就是标准团队希望它成为“便携式汇编器”的原因。 无法保证未来的架构中存在rol和ror。 或者可能表现不同。 因此,它远离标准。