微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#将位旋转到左溢出问题

我一直试图让这个工作好几天,我已经阅读了一千个指南和人们的问题,但是,我仍然无法找到一种正确的方法.

我想要做的是将位旋转到左侧,这是一个例子.

原始号码= 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(如果您有时可能想要向右旋转,则标准化为非负数).

原文地址:https://www.jb51.cc/csharp/97353.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐