Som*_*ame 13 c bitwise-operators
我想,这是一个哲学问题.
C语言有一组标准的逐位运算的,其中包括OR
,AND
,XOR
,SHIFT LEFT/RIGHT
,和NOT
.为什么不旋转左/右旋转操作符或语言中包含的函数?
这些运算符与其他逐位运算符具有相同的复杂性,并且通常需要单个汇编指令,就像其他运算符一样.此外,我可以想到旋转运算符的很多用途,可能不会比xor
运算符少 - 所以对我来说听起来有些奇怪,它们不包括在C中.
如果您确实需要使用C或C++进行旋转,那么有关于它的最佳实践的单独常见问题解答.关于这个问题的讨论是偏离主题的.
我认为这是因为有两种类型的旋转:有和没有进位,根据生成的机器的CARRY标志(1或0),可以不同地进行旋转.这意味着实现总共4个操作符,从而使语言不必要地复杂化,前提是可以像@Aniket所示简单地实现旋转.
编辑:
然而,转移也可以签名和签名.实际上Javascript有两个运营商,AFAIK.但是,由于C支持有符号和无符号变量,我认为执行有符号的移位是没有意义的,因为编译器应该知道我们是否正在移位有符号或无符号变量.有符号/无符号移位对于算术计算很有用,C编译器可以使用它们来生成汇编代码.例如,许多算术运算,例如乘以或除以2的幂,由编译器转换为移位运算.我们在C中使用移位运算符的唯一原因是使用位掩码.
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 会出现在未来的架构中。或者可能表现不同。因此它远离标准。