4

intは4バイトで構成されます。これらの4バイトの1つを新しいバイトに置き換えるにはどうすればよいですか。言い換えれば、私は方法を探しています:

int ReplaceByte(int index, int value, byte replaceByte)
{
     // implementation
}

たとえば、値が(-1)で、バイトを(10)FFFFFFFFに置き換えたい場合は、メソッドを次のように呼び出します。00A

ReplaceByte(0,-1,10)

そして私はそのメソッドが私を返すのが好きですFFFFFF0A

intをバイト配列に変換してから、必要なバイトを置き換えてから、intに戻す必要がありますか?私はこれを行うための効率的な方法を探しています。ターゲット(ボード)に接続するプログラムのようなデバッガーを作成しており、これらの値を頻繁に更新しています。

編集(結果)

あなたの答えのおかげで私は方法を比較しました:

結果は次のとおりです。

ここに画像の説明を入力してください

私の実装が最も遅いことに注意してください!

コードは次のとおりです。

    static void Main ( string[ ] args )
    {
        byte[ ] randomBytes = new byte[ 1024 * 1024 * 512 ]; 

        Random r = new Random( );
        r.NextBytes( randomBytes );

        Int64 sum;
        var now = DateTime.Now;

        Console.WriteLine( "Test 1" );
        sum = 0;
        now = DateTime.Now;
        foreach ( var bt in randomBytes )
        {
            sum += ReplaceByte1( 1 , -1 , bt );
        }

        Console.WriteLine( "Test 1 finished in {0} seconds \t hash = {1} \n" , ( DateTime.Now - now ).TotalSeconds, sum );

        Console.WriteLine( "Test 2" );
        sum = 0;
        now = DateTime.Now;
        foreach ( var bt in randomBytes )
        {
            sum += ReplaceByte2( 1 , -1 , bt );
        }

        Console.WriteLine( "Test 2 finished in {0} seconds \t hash = {1} \n" , ( DateTime.Now - now ).TotalSeconds,  sum );


        Console.WriteLine( "Test 3" );
        sum = 0;
        now = DateTime.Now;
        foreach ( var bt in randomBytes )
        {
            sum += ReplaceByte3( 1 , -1 , bt );
        }

        Console.WriteLine( "Test 3 finished in {0} seconds \t hash = {1} \n" , ( DateTime.Now - now ).TotalSeconds , sum );

        Console.Read( );            
    }

    // test 1
    static int ReplaceByte1 ( int index , int value , byte replaceByte )
    {
        return ( value & ~( 0xFF << ( index * 8 ) ) ) | ( replaceByte << ( index * 8 ) );
    }

    // test 2
    static int ReplaceByte2 ( int index , int value , byte replaceByte )
    {
        // how many bits you should shift replaceByte to bring it "in position"
        var shiftBits = 8 * index;

        // bitwise AND this with value to clear the bits that should become replaceByte
        var mask = ~( 0xff << shiftBits );

        // clear those bits and then set them to whatever replaceByte is
        return value & mask | ( replaceByte << shiftBits );
    }

    // test 3
    static int ReplaceByte3 ( int index , int value , byte replaceByte )
    {
        var bytes = BitConverter.GetBytes( value );
        bytes[ index ] = replaceByte;

        return BitConverter.ToInt32( bytes , 0 );
    }
4

2 に答える 2

6

いいえ、バイト配列はありません。これは実際には非常に簡単です。

未検証:

int ReplaceByte(int index, int value, byte replaceByte)
{
    return (value & ~(0xFF << (index * 8))) | (replaceByte << (index * 8));
}

最初に、指定されたインデックスのスペースをクリアし、次にそのスペースに新しい値を配置します。

于 2012-10-31T15:24:10.413 に答える
5

単純にビット単位の演算を使用できます。

// how many bits you should shift replaceByte to bring it "in position"
var shiftBits = 8 * index;

// bitwise AND this with value to clear the bits that should become replaceByte
var mask = ~(0xff << shiftBits);

// clear those bits and then set them to whatever replaceByte is
return value & mask | (replaceByte << shiftBits);
于 2012-10-31T15:24:27.887 に答える