对定义为无符号字节位范围的数字执行带符号算术运算

时间:2011-07-01 17:06:00

标签: c#

我有两个字节。我需要将它们变成两个整数,其中前12位构成一个int而后四个构成另一个。我认为我可以&&第二个字节用0x0f得到4位,但我不知道如何将它变成带有正确符号的字节。

更新: 只是为了澄清我有2个字节

byte1 = 0xab
byte2 = 0xcd

我需要用它来做这样的事情

var value = 0xabc * 10 ^ 0xd;
抱歉这令人困惑。

感谢所有帮助。

5 个答案:

答案 0 :(得分:4)

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

尝试使用此代码

答案 1 :(得分:4)

踢腿:

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

答案 2 :(得分:3)

好的,让我们再试一次,知道我们要拍的是什么。我在VS2008中尝试了以下操作,它似乎工作正常,即最后outOneoutTwo = -1。这就是你要找的东西吗?

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

答案 3 :(得分:1)

假设您有以下字节:

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

并考虑0xab前8位和0xcd后8位,或0xabc前12位和0xd后4位。然后你可以得到如下这些位;

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

答案 4 :(得分:0)

编辑以考虑“签署”规则的澄清:

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 ;
}