我一直试图让这个工作好几天,我已经阅读了一千个指南和人们的问题,但是,我仍然无法找到一种正确的方法.
我想要做的是将位旋转到左侧,这是一个例子.
原始号码= 10000001 = 129
我需要的是= 00000011 = 3
我必须将这些位旋转一定时间(这取决于用户输入的内容),这就是我所做的:
byte b = (byte)129; byte result = (byte)((byte)b << 1); Console.WriteLine(result); Console.Write("Press any key to continue . . . "); Console.ReadKey(true);
这个问题是当我尝试使用带有该数字的(<<<<)运算符时它会导致错误(OverflowException)(请注意,如果我将第一位的数字设置为0;例如:3 = 00000011;它按预期工作,结果返回6. 问题是,如果第一位是1,它会给我(OverflorException)错误.我知道这不是旋转,它只是一个移位,第一位消失,在字节结束时弹出一个0,然后我可以用OR 000000001操作改变它使它成为1(如果第一位是一个1,如果它是0我只是留在那里). 有任何想法吗?提前致谢!
解决方法
你得到一个溢出异常,因为你在一个检查的上下文中运行,显然.
您可以通过将代码放在未经检查的上下文中来解决这个问题 – 或者只是确保您不会对可以超过255的值执行强制转换为字节.例如:
int shifted = b << rotateLeftBits; int highBits = shifted & 0xff; int lowBits = shifted >> 8; // PrevIoUsly high bits,rotated byte result = (byte) (highBits | lowBits);
这适用于最大8的旋转尺寸.对于更大的尺寸,只需使用rotateLeftBits%8(如果您有时可能想要向右旋转,则标准化为非负数).