当前位置:  开发笔记 > 编程语言 > 正文

有没有办法在C#中执行循环位移?

如何解决《有没有办法在C#中执行循环位移?》经验,为你挑选了2个好方法。

我知道以下是真的

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

但是,如果你换得太远,那些位就会掉线.发生这种情况的原因与您正在使用的整数大小有关.

有没有办法执行移位,以便位旋转到另一侧?我正在寻找一个单独的操作,而不是for循环.



1> Chris Marast..:

如果您知道类型的大小,您可以执行以下操作:

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

...将执行32位值的循环移位.

作为循环移位左移n位的推广,在ab位变量上:

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


@评论,似乎C#确实以不同方式处理高位有符号值.我在这里找到了一些相关信息.我还将示例更改为使用uint.


好吧,无论如何,只有无符号整数才能旋转位.
@ LasseV.Karlsen:我不一定同意这一点.[`GetHashCode`](http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx)返回一个(签名的)`int`,如果你想通过使用均匀分配哈希码它的全部32位(*可以*涉及位旋转),符号并不重要 - 显然会妨碍位旋转.

2> jaircazarin-..:

一年前,我将为我的本科毕业论文实施MD4.这是我使用UInt32实现循环位移.

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

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有