Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个';s补码转换_C#_Twos Complement - Fatal编程技术网

C# 两个';s补码转换

C# 两个';s补码转换,c#,twos-complement,C#,Twos Complement,我需要将2的补码格式的字节转换为正整数字节。 范围-128到127映射到0到255 Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc. 编辑为了消除混淆,输入字节(当然)是0到255范围内的无符号整数。但它使用2的补码格式表示-128到127范围内的有符号整数。例如,输入字节值128(二进制10000000)实际上表示-128 额外编辑好的,假设我们有以下字节流0255254,1127。在2的补码格式中,这表示0

我需要将2的补码格式的字节转换为正整数字节。 范围-128到127映射到0到255

Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc.
编辑为了消除混淆,输入字节(当然)是0到255范围内的无符号整数。但它使用2的补码格式表示-128到127范围内的有符号整数。例如,输入字节值128(二进制10000000)实际上表示-128


额外编辑好的,假设我们有以下字节流0255254,1127。在2的补码格式中,这表示0,-1,-2,1127。这我需要夹持到0到255的范围。有关更多信息,请查看这篇难找的文章:

从您想要的示例输入:

sbyte something = -128;

byte foo = (byte)( something + 128);

你可以描述一些简单的事情,比如给你的数字加上一个偏差(在本例中,给有符号的数字加上128)


答对了:-)

如果我理解正确,您的问题是如何转换输入,它实际上是一个有符号字节(),但该输入存储在一个无符号整数中,然后通过将其转换为零来避免负值

需要明确的是,当您使用有符号类型(如
ubyte
)时,框架在幕后使用了
Two's complete
,因此只要将其转换为正确的类型,您就可以使用Two's complete

然后,一旦转换完成,就可以使用简单的
if
或条件三元运算符()钳制负值

对于值
从128到255(或从-128到-1),下面显示的函数将返回
0
,对于值
从0到127
,函数将返回相同的值

因此,如果必须使用无符号整数作为输入和输出,则可以使用如下内容:

private static uint ConvertSByteToByte(uint input)
{
    sbyte properDataType = (sbyte)input; //128..255 will be taken as -128..-1
    if (properDataType < 0) { return 0; } //when negative just return 0
    if (input > 255) { return 0; } //just in case as uint can be greater than 255
    return input;
}
sbyte test1 = -1;
byte test2 = (byte)test1;
专用静态uint转换器字节到字节(uint输入)
{
sbyte properDataType=(sbyte)输入;//128..255将被视为-128..-1
如果(properDataType<0){return 0;}//为负数时只返回0
if(input>255){return 0;}//以防万一,因为uint可以大于255
返回输入;
}
或者,IMHO,您可以将输入和输出更改为最适合您的输入和输出的数据类型(sbyte和byte):

专用静态字节转换器SByteTobyte(sbyte输入)
{
返回输入<0?(字节)0:(字节)输入;
}
试试看


xor MSB,仅此而已

我认为2s补码字节最好使用以下方法完成。也许不优雅或不短,但清晰和明显。我将把它作为一个静态方法放在我的一个util类中

public static sbyte ConvertTo2Complement(byte b)
{
    if(b < 128)
    {
        return Convert.ToSByte(b);
    }
    else
    {
        int x = Convert.ToInt32(b);
        return Convert.ToSByte(x - 256);
    }
}
公共静态sbyte CONVERTO2COMPLEMENT(字节b)
{
if(b<128)
{
返回Convert.ToSByte(b);
}
其他的
{
int x=转换为32(b);
返回Convert.ToSByte(x-256);
}
}

对于大于8位的数字,这是我的解决方案。我的例子是16位值。注意:您必须检查第一位,看它是否为负数

步骤:

  • 在变量前加上“~”将#转换为恭维。(即y=~y)

  • 将#s转换为二进制字符串

  • 将二进制字符串拆分为字符数组

  • 从最右边的值开始,添加1,跟踪进位。将结果存储在字符数组中

  • 将字符数组转换回字符串

    private string TwosComplimentMath(string value1, string value2)
    {
        char[] binary1 = value1.ToCharArray();
        char[] binary2 = value2.ToCharArray();
        bool carry = false;
        char[] calcResult = new char[16];
    
        for (int i = 15; i >= 0; i--)
        {
            if (binary1[i] == binary2[i])
            {
                if (binary1[i] == '1')
                {
                    if (carry)
                    {
                        calcResult[i] = '1';
                        carry = true;
                    }
                    else
                    {
                        calcResult[i] = '0';
                        carry = true;
                    }
                }
                else
                {
                    if (carry)
                    {
                        calcResult[i] = '1';
                        carry = false;
                    }
                    else
                    {
                        calcResult[i] = '0';
                        carry = false;
                    }
                }
            }
            else
            {
                if (carry)
                {
                    calcResult[i] = '0';
                    carry = true;
                }
                else
                {
                    calcResult[i] = '1';
                    carry = false;
                }
            }
    
        }
    
        string result = new string(calcResult);
        return result;
    
    }
    

  • 所以问题是OP的问题实际上不是二的补码转换。他给一组值添加了一个偏差,将范围从-128..127调整到0..255

    要实际执行2的补码转换,只需将有符号值转换为无符号值,如下所示:

    private static uint ConvertSByteToByte(uint input)
    {
        sbyte properDataType = (sbyte)input; //128..255 will be taken as -128..-1
        if (properDataType < 0) { return 0; } //when negative just return 0
        if (input > 255) { return 0; } //just in case as uint can be greater than 255
        return input;
    }
    
    sbyte test1 = -1;
    byte test2 = (byte)test1;
    
    -1变成255-128变成128。不过,这听起来不像OP想要的。他只想向上滑动一个数组,使最低的有符号值(-128)变成最低的无符号值(0)

    要添加偏差,只需执行整数加法:

    newValue = signedValue+128;
    

    字节
    未签名,您想做什么?我仍然不完全确定这里尝试了什么。这可能是所有答案给你的方式,或者你对2的补码表示理解不正确。由于我找不到
    bingo
    关键字,我编辑了你的答案以确保可读性:-)“old”是原始字节值还是它的转换?如果是原始字节值,则给出错误答案。如果是后者,那么这就是我所要求的过程。@Yehonatan:但是你想如何在0到255的范围内表示-1?这看起来不像是C#到meThis,这并没有实现OPs规定的目标。他希望-128变成0。这只是一个整数加法。结果=有符号字节+128;
    public static sbyte ConvertTo2Complement(byte b)
    {
        if(b < 128)
        {
            return Convert.ToSByte(b);
        }
        else
        {
            int x = Convert.ToInt32(b);
            return Convert.ToSByte(x - 256);
        }
    }
    
    private string TwosComplimentMath(string value1, string value2)
    {
        char[] binary1 = value1.ToCharArray();
        char[] binary2 = value2.ToCharArray();
        bool carry = false;
        char[] calcResult = new char[16];
    
        for (int i = 15; i >= 0; i--)
        {
            if (binary1[i] == binary2[i])
            {
                if (binary1[i] == '1')
                {
                    if (carry)
                    {
                        calcResult[i] = '1';
                        carry = true;
                    }
                    else
                    {
                        calcResult[i] = '0';
                        carry = true;
                    }
                }
                else
                {
                    if (carry)
                    {
                        calcResult[i] = '1';
                        carry = false;
                    }
                    else
                    {
                        calcResult[i] = '0';
                        carry = false;
                    }
                }
            }
            else
            {
                if (carry)
                {
                    calcResult[i] = '0';
                    carry = true;
                }
                else
                {
                    calcResult[i] = '1';
                    carry = false;
                }
            }
    
        }
    
        string result = new string(calcResult);
        return result;
    
    }
    
    sbyte test1 = -1;
    byte test2 = (byte)test1;
    
    newValue = signedValue+128;