在java中有一个名为rotatetoleft的函数生成一个生成的数字
int n;
n = Integer.rotateLeft(1, 5);
System.out.print(n);
输出; 32
c#中有什么与此类似的?
听起来您只是在<<
操作员之后,但这仅执行左移;它不会旋转到 LSB。为此,您必须混合使用班次和 OR。例如:
static int RotateLeft(int value, int shift)
{
return (value << shift) | (value >> (32 - shift));
}
请注意,如果value
由于右移符号扩展而设置了它的最高位,这将无法正常工作。您可以通过执行以下算术来解决此问题uint
:
static int RotateLeft(int value, int shift)
{
unchecked
{
uint uvalue = (uint) value;
uint uresult = (uvalue << shift) | (uvalue >> 32 - shift);
return (int) uresult;
}
}
我认为 C# 中没有类似的东西,我在这里发现了一个类似的问题,并且答案表明了这种实现:(C 语言)
unsigned int _rotl(const unsigned int value, int shift)
{
if ((shift &= sizeof(value) * 8 - 1) == 0)
return value;
return (value << shift) | (value >> (sizeof(value)*8 - shift));
}
unsigned int _rotr(const unsigned int value, int shift)
{
if ((shift &= sizeof(value) * 8 - 1) == 0)
return value;
return (value >> shift) | (value << (sizeof(value)*8 - shift));
}