我知道,下面是真的

int i = 17; //binary 10001
int j = i << 1; //decimal 34, binary 100010

但是,如果你移动得太远,位掉下来的结束。在哪里发生这种情况是一个问题的大小的整数。

有没有办法执行移使位绕到另一边?我在寻找一个单一的操作,不是一个为环。

有帮助吗?

解决方案

如果你知道的尺寸类型,你可以做一些事情,如:

uint i = 17;
uint j = i << 1 | i >> 31;

...这将执行一个圆形移的一个32位数值。

作为一个概括圆左移n位,在b位变量:

/*some unsigned numeric type*/ input = 17;
var result = input  << n | input  >> (b - n);


@的评论,似乎C#不享的高位签署了价值不同。我发现了一些信息在这 在这里,.我也改变了例如使用uint。

其他提示

一年前我执行MD4我的本科生论文。这是我的执行情况的圆点转移使用UInt32.

private UInt32 RotateLeft(UInt32 x, Byte n)
{
      return UInt32((x << n) | (x >> (32 - n)));
}

只是作为参考上如何做到这一点,这两种功能的工作完全用于旋转位的1/2word:

static public uint ShiftRight(uint z_value, int z_shift)
{
    return ((z_value >> z_shift) | (z_value << (16 - z_shift))) & 0x0000FFFF;
}

static public uint ShiftLeft(uint z_value, int z_shift)
{
    return ((z_value << z_shift) | (z_value >> (16 - z_shift))) & 0x0000FFFF;
}

这将是容易的扩展对于任何给定的大小。

最着名的应用程序是解决的约瑟夫问题(作为讨论的具体数学,请参阅 http://oeis.org/A006257).这基本上是一个难题没有明显的应用。在 这个视频, 我明之间的连接的第二阶约瑟夫问题和完成平衡的树木。它仍然不是一个应用程序,但略有在正确的方向。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top