15

我想这是一个哲学问题。

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

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

如果您确实需要在 C 或 C++ 中进行轮换,则有一个单独的常见问题解答关于它的最佳实践。对此问题的讨论是题外话。

4

2 回答 2

6

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

编辑

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

于 2012-10-27T10:57:06.567 回答
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)));
}

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

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

于 2012-10-27T10:47:32.067 回答