C#中的循环左旋转算法
本文关键字:旋转 算法 循环 | 更新日期: 2023-09-27 18:27:34
所以我有这个算法可以进行左旋转
public static ushort RotateLeft(ushort value, int count)
{
int left = value << count;
int right = value >> (16 - count);
return (ushort)(left | right);
}
然而,这并没有产生我想要的值,例如,如果我的值为18,当向左旋转1位时,结果应该是3,但这只是在末尾添加了一个零:
这就是算法的作用:
10010 18
100100 36
这就是我想要的:
10010 18
00101 3
比特应该移出符号比特位置(比特0),进入最低有效比特位置(位15),因此,没有比特丢失。
这里描述了我想要的:http://www.xgc.com/manuals/m1750-ada/m1750/x2733.html
这是一个CRC算法,我想将其转换为C#
您的代码应该按照如下方式进行更正。
我添加了新的参数"numberOfBits"来表示要旋转的位数。
public static ushort RotateLeft(ushort value, int numberOfBits int countToRotate)
{
countToRotate = countToRotate mod numberOfBits; // in case of rotate more than once.
ushort mask = -1 // 1s for all 16 bits.
mask = mask << numberOfBits;
int left = value << countToRotate; // rotate left
int right = left >> (numberOfBits); // move left-overflowed bits to right
return (ushort)((left | right) & mask);
}
如果(numOfBits+countToRotate)<16.
(x << n) | (x >> (<bit size> - n))
应该给你适当的转变,这就是你的职能正在做的。