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

时间:2012-10-27 10:39:38

标签: c bitwise-operators

我想是一个哲学问题。

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

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

如果您确实需要使用C或C ++进行旋转,there's a separate FAQ question about best-practices for it。对此问题的讨论是偏离主题的。

2 个答案:

答案 0 :(得分:6)

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

修改

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

答案 1 :(得分:0)

对于二进制文件,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)));
}

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

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