开发者

Perform signed arithmetic on numbers defined as bit ranges of unsigned bytes

开发者 https://www.devze.com 2023-03-16 15:25 出处:网络
I have two bytes.I need to turn them into two integers where the first 12 bits make one int开发者_Go百科 and the last 4 make the other.I figure i can && the 2nd byte with 0x0f to get the 4 bit

I have two bytes. I need to turn them into two integers where the first 12 bits make one int开发者_Go百科 and the last 4 make the other. I figure i can && the 2nd byte with 0x0f to get the 4 bits, but I'm not sure how to make that into a byte with the correct sign.

update: just to clarify I have 2 bytes

byte1 = 0xab
byte2 = 0xcd

and I need to do something like this with it

var value = 0xabc * 10 ^ 0xd;

sorry for the confusion.

thanks for all of the help.


int a = 10;
int a1 = a&0x000F;
int a2 = a&0xFFF0;

try to use this code


For kicks:

public static partial class Levitate
{
    public static Tuple<int, int> UnPack(this int value)
    {
        uint sign = (uint)value & 0x80000000;
        int small = ((int)sign >> 28) | (value & 0x0F);
        int big = value & 0xFFF0;

        return new Tuple<int, int>(small, big);
    }
}

int a = 10;
a.UnPack();


Ok, let's try this again knowing what we're shooting for. I tried the following out in VS2008 and it seems to work fine, that is, both outOne and outTwo = -1 at the end. Is that what you're looking for?

byte b1 = 0xff;
byte b2 = 0xff;
ushort total = (ushort)((b1 << 8) + b2);
short outOne = (short)((short)(total & 0xFFF0) >> 4);
sbyte outTwo = (sbyte)((sbyte)((total & 0xF) << 4) >> 4);


Assuming you have the following to bytes:

byte a = 0xab;
byte b = 0xcd;

and consider 0xab the first 8 bits and 0xcd the second 8 bits, or 0xabc the first 12 bits and 0xd the last four bits. Then you can get the these bits as follows;

int x = (a << 4) | (b >> 4);   // x == 0x0abc
int y = b & 0x0f;              // y == 0x000d


edited to take into account clarification of "signing" rules:

public void unpack( byte[] octets , out int hiNibbles , out int loNibble )
{
  if ( octets        == null ) throw new ArgumentNullException("octets");
  if ( octets.Length != 2    ) throw new ArgumentException("octets") ;

  int value = (int) BitConverter.ToInt16( octets , 0 ) ;

  // since the value is signed, right shifts sign-extend
  hiNibbles =   value >>  4         ;
  loNibble  = ( value << 28 ) >> 28 ;

  return ;
}
0

精彩评论

暂无评论...
验证码 换一张
取 消