2

こんにちはビットシフトに関する簡単な質問

私はHEXで値を持っていますnew byte[] { 0x56, 0xAF }; :0101 0110 1010 1111

最初の N ビット、たとえば 12 が必要です。

次に、最下位 4 ビット (16 - 12) を右シフトして0000 0101 0110 1010(1386 dec) を取得する必要があります。

私は頭を包み込み、nビットでスケーラブルにすることはできません。

4

5 に答える 5

7

少し前に、これらの 2 つの関数をコーディングしました。最初の関数は byte[] を指定された量のビットだけ左にシフトし、2 番目の関数は同じことを右にシフトします。

左方移動:

public byte[] ShiftLeft(byte[] value, int bitcount)
{
    byte[] temp = new byte[value.Length];
    if (bitcount >= 8)
    {
        Array.Copy(value, bitcount / 8, temp, 0, temp.Length - (bitcount / 8));
    }
    else
    {
        Array.Copy(value, temp, temp.Length);
    }
    if (bitcount % 8 != 0)
    {
        for (int i = 0; i < temp.Length; i++)
        {
            temp[i] <<= bitcount % 8;
            if (i < temp.Length - 1)
            {
                temp[i] |= (byte)(temp[i + 1] >> 8 - bitcount % 8);
            }
        }
    }
    return temp;
}

右シフト:

public byte[] ShiftRight(byte[] value, int bitcount)
{
    byte[] temp = new byte[value.Length];
    if (bitcount >= 8)
    {
        Array.Copy(value, 0, temp, bitcount / 8, temp.Length - (bitcount / 8));
    }
    else
    {
        Array.Copy(value, temp, temp.Length);
    }
    if (bitcount % 8 != 0)
    {
        for (int i = temp.Length - 1; i >= 0; i--)
        {
            temp[i] >>= bitcount % 8;
            if (i > 0)
            {
                temp[i] |= (byte)(temp[i - 1] << 8 - bitcount % 8);
            }
        }
    }
    return temp;
}

さらに説明が必要な場合は、これについてコメントしてください。明確にするために投稿を編集します...

于 2009-12-02T10:32:44.587 に答える
1

あなたは次のようなものが欲しい...

var HEX = new byte[] {0x56, 0xAF};
var bits = new BitArray(HEX);
int bitstoShiftRight = 4;
for (int i = 0; i < bits.Length; i++)
{
   bits[i] = i < (bits.Length - bitstoShiftRight) ? bits[i + bitstoShiftRight] : false;
}
bits.CopyTo(HEX, 0);
于 2009-08-14T02:05:39.397 に答える
1

BitArray を使用して、各ビットを右から右に簡単にコピーできます。

http://msdn.microsoft.com/en-us/library/system.collections.bitarray_methods.aspx

于 2009-08-14T01:27:38.840 に答える
0

合計ビット数が k で、"最初の" (最上位の) n ビットが必要な場合は、単純に kn 回右シフトできます。最後のknビットは、一種の「落下」によって削除され、最初のnビットは最下位側に移動されます。

于 2009-08-14T02:06:05.560 に答える
0

bits_in_byteが別の場所で決定されたバイト内のビット数であると仮定して、C に似た表記を使用して応答します。

int remove_bits_count= HEX.count*bits_in_byte - bits_to_keep;
int remove_bits_in_byte_count= remove_bits_count % bits_in_byte;

if (remove_bits_count > 0)
{
    for (int iteration= 0; iteration<min(HEX.count, (bits_to_keep + bits_in_byte - 1)/bits_in_byte); ++iteration)
    {
        int write_index= HEX.count - iteration - 1;
        int read_index_lo= write_index - remove_bits_count/bits_in_byte;

        if (read_index_lo>=0)
        {
            int read_index_hi= read_index_lo - (remove_bits_count + bits_in_byte - 1)/bits_in_byte;

            HEX[write_index]= 
                (HEX[read_index_lo] >> remove_bits_in_byte_count) | 
                (HEX[read_index_hi] << (bits_in_byte - remove_bits_in_byte_count));
        }
        else
        {
            HEX[write_index]= 0;
        }
    }
}

元の配列を上書きしていると仮定すると、基本的に書き込み先のすべてのバイトを取得し、シフトされたビットを取得するバイトを特定します。読み取る必要のあるデータを上書きしないように、配列の末尾から先頭に移動します。

于 2009-08-24T16:49:42.850 に答える