14

2 の補数形式のバイトを正の整数バイトに変換する必要があります。-128 から 127 の範囲が 0 から 255 にマップされます。

Examples: -128 (10000000) -> 0 , 127 (01111111) -> 255, etc.

編集混乱を解消するために、入力バイトは (もちろん) 0 から 255 の範囲の符号なし整数です。ただし、2 の補数形式を使用して -128 から 127 の範囲の符号付き整数を表します。たとえば、入力バイト値 128 (バイナリ 10000000) は、実際には -128 を表します。

余分な編集 さて、次のバイトストリームがあるとしましょう 0,255,254,1,127 . 2 の補数形式では、これは 0、-1、-2、1、127 を表します。これは、0 から 255 の範囲にクランプする必要があります。詳細については、この見つけにくい記事を参照してください: 2 の補数

4

10 に答える 10

8

入力のサンプルから、次のことが必要です。

sbyte something = -128;

byte foo = (byte)( something + 128);
于 2010-09-28T12:13:14.153 に答える
7
new = old + 128;

ビンゴ:-)

于 2010-09-28T12:13:35.023 に答える
3

試す

sbyte signed = (sbyte)input;

また

int signed = input | 0xFFFFFF00;
于 2010-10-12T20:20:20.923 に答える
2

2秒の補数バイトは次の方法で行うのが最適だと思います。エレガントでも短くもないかもしれませんが、明確で明白です。utilクラスの1つに静的メソッドとして配置します。

public static sbyte ConvertTo2Complement(byte b)
{
    if(b < 128)
    {
        return Convert.ToSByte(b);
    }
    else
    {
        int x = Convert.ToInt32(b);
        return Convert.ToSByte(x - 256);
    }
}
于 2013-02-03T12:08:59.697 に答える
2
    public static byte MakeHexSigned(byte value)
    {
        if (value > 255 / 2)
        {
            value = -1 * (255 + 1) + value;
        }

        return value;
    }
于 2011-11-22T16:13:03.533 に答える
1
int8_t indata; /* -128,-127,...-1,0,1,...127 */
uint8_t byte = indata ^ 0x80;

xor MSB、それだけです

于 2012-09-25T13:34:19.053 に答える
1

私が正しく理解していない場合、問題は入力を変換する方法です。これは実際にはsigned-byte( sbyte ) ですが、その入力は a に格納され、unsigned integer負の値をゼロに変換して回避します。

明確にするために、符号付き型 ( などubyte) を使用する場合、フレームワークはTwo's complement舞台裏で使用しているため、正しい型にキャストするだけで、2 の補数を使用することになります。

次に、その変換が完了したら、単純ifまたは条件付き三項演算子 ( ?: ) を使用して負の値をクランプできます。

0以下に示す関数は、値from 128 to 255(または -128 から -1) と値を返しthe same valueますfrom 0 to 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;
}

または、IMHO、入力と出力を入力と出力に最適なデータ型 (sbyte と byte) に変更できます。

private static byte ConvertSByteToByte(sbyte input)
{
    return input < 0 ? (byte)0 : (byte)input;
}
于 2010-10-12T20:01:25.740 に答える
1

これが、8ビットより大きい数値の場合の、この問題に対する私の解決策です。私の例は 16 ビット値です。注: 最初のビットをチェックして、それが負かどうかを確認する必要があります。

手順:

  1. 変数の前に「~」を置くことで、# を補数に変換します。(つまり、y = ~y)

  2. # をバイナリ文字列に変換する

  3. バイナリ文字列を文字配列に分割する

  4. 一番右の値から始めて、キャリーを追跡しながら 1 を追加します。結果を文字配列に格納します。

  5. 文字配列を文字列に変換します。

    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;
    
    }
    
于 2013-07-10T13:27:53.437 に答える
0

数値にバイアスを追加するのと同じくらい簡単なことを説明できます (この場合、符号付き数値に 128 を追加します)。

于 2010-09-28T12:13:16.833 に答える