题
我知道,下面是真的
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;
}
这将是容易的扩展对于任何给定的大小。
我必须承认,我只是做了一个搜索"C#位旋转",并发现了一个 页面的链接与Java类,将是很容易地适应C#
最着名的应用程序是解决的约瑟夫问题(作为讨论的具体数学,请参阅 http://oeis.org/A006257).这基本上是一个难题没有明显的应用。在 这个视频, 我明之间的连接的第二阶约瑟夫问题和完成平衡的树木。它仍然不是一个应用程序,但略有在正确的方向。
不隶属于 StackOverflow