有没有办法在C#中执行循环移位?
时间:2020-03-05 18:45:11 来源:igfitidea点击:
我知道以下是对的
int i = 17; //binary 10001 int j = i << 1; //decimal 34, binary 100010
但是,如果移得太远,则位会掉到末端。这种情况的发生与所使用的整数大小有关。
有没有一种方法可以执行移位操作,使位旋转到另一侧?我在寻找单个操作,而不是for循环。
解决方案
回答
如果我们知道类型的大小,则可以执行以下操作:
uint i = 17; uint j = i << 1 | i >> 31;
...将执行32位值的循环移位。
作为对b位变量上的n位循环左移的概括:
/*some unsigned numeric type*/ input = 17; var result = input << n | input >> (b - n);
@评论,似乎Cdoes对待签名值的高位有所不同。我在这里找到了一些信息。我还更改了示例以使用uint。
回答
我不得不承认,我只是搜索了" Cbit rotation",并找到了一个指向带有Java类的页面的链接,该页面很容易适应C#
我也在Google图书中发现了这一点,它是具有类似行为的C ++函数
回答
一年前,我必须为我的本科论文实施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; }
将其扩展为任何给定大小将很容易。