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#

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))

应该给你适当的转变,这就是你的职能正在做的。