C# Rotate bits to left overflow issue

左心房为你撑大大i 提交于 2019-12-05 08:02:00

You're getting an overflow exception because you're operating in a checked context, apparently.

You can get around that by putting the code in an unchecked context - or just by making sure you don't perform the cast back to byte on a value that can be more than 255. For example:

int shifted = b << rotateLeftBits;
int highBits = shifted & 0xff;
int lowBits = shifted >> 8; // Previously high bits, rotated
byte result = (byte) (highBits | lowBits);

This will work for rotate sizes of up to 8. For greater sizes, just use rotateLeftBits % 8 (and normalize to a non-negative number if you might sometimes want to rotate right).

<< is a shift operator, not a rotate one.

If you want to rotate, you can use (with suitable casting):

b = (b >> 7) | ((b & 0x7f) << 1);

The first part of that gets the leftmost bit down to the rightmost, the second part shifts all the other left.

The or-ing them with | combines the two.

Thanks for your answers!

Shortly after i made this post i came up with an idea to solve this problem, let me show you (Before you ask, it works!):

byte b = (byte)129; 
b = (byte)((byte)b & 127); 
byte result = (byte)((byte)b << 1); 
result = (byte)((byte)result | 1); 
Console.WriteLine(result); 

What this does is, removes the first bit (in case if it is a 1) it shifts to the left that zero (doesnt generate overflow) and once the shift is over, it changes that 0 back to 1. If that first bit was a 0, it will just move that zero (note that this is just a piece of the whole code, and as it is partially written in spanish (the comments and variables) i doubt you will understand most of it, so i decided to take out the problematic part to show it to you guys!

I will still try the things you told me and see how it goes, again, thanks a lot for your answers!

please try this function - rotates in both directions (left and right rotation of an 8 bit value) [I didn't tested that function!]

// just for 8Bit values (byte)
byte rot(byte value, int rotation)
    {
        rotation %= 8;

        int result;
        if(rotation < 0)
        {
            result = value << (8 + rotation);
        }
        else
        {
            result = value << rotation;
        }

        byte[] resultBytes = BitConverter.GetBytes(result);
        result = resultBytes[0] | resultBytes[1];

        return (byte)result;
    }

short rot(short value, int rotation) { ... }
int rot(int value, int rotation) { ... }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!