我知道以下是真的
int i = 17; //binary 10001
int j = i << 1; //decimal 34, binary 100010
但是,如果你换得太远,那些位就会掉线。发生这种情况的原因与您正在使用的整数大小有关。
有没有办法执行移位以使位旋转到另一侧?我正在寻找一个单独的操作,而不是for循环。
答案 0 :(得分:48)
如果您知道类型的大小,您可以执行以下操作:
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);
<小时/> @评论,似乎C#确实以不同方式处理高位有符号值。我在here找到了一些信息。我还将示例更改为使用uint。
答案 1 :(得分:10)
一年前,我要为我的本科毕业论文实施MD4。这是我使用UInt32实现循环位移。
private UInt32 RotateLeft(UInt32 x, Byte n)
{
return UInt32((x << n) | (x >> (32 - n)));
}
答案 2 :(得分:3)
就像如何做到这一点一样,这两个函数非常适合旋转1/2字的位:
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;
}
将其扩展到任何给定的大小都很容易。
答案 3 :(得分:3)
从.NET Core 3.0开始,分别是BitOperations.RotateLeft()
和BitOperations.RotateRight()
,因此您可以使用类似的
BitOperations.RotateRight(12, 3);
BitOperations.RotateLeft(34L, 5);
在以前的版本中,您可以在Microsoft.VisualStudio.Utilities中使用BitRotator.RotateLeft()
和BitRotator.RotateRight()
答案 4 :(得分:1)
旋转 User
位(32 位)的扩展方法:
const { id } = useParams();
答案 5 :(得分:0)
我不得不承认,我刚刚搜索了“C#位旋转”并找到了link to a page with a Java class that would be easily adapted to C#
I also found this in Google Book which is a C++ function with similar behavior
答案 6 :(得分:0)
最着名的应用是约瑟夫斯问题的解决方案(如具体数学所述,见http://oeis.org/A006257)。这基本上是一个没有明显应用的难题。在this video中,我展示了二阶约瑟夫斯问题与完全平衡树之间的联系。它仍然不是一个应用程序,而是朝着正确的方向略微移动。