1

私は一生懸命努力しましたが、このコードで何が起こっているのか理解できないようです。誰でも光を当てることができますか?

public class BitArrary
{
    private Byte[] m_byteArray;
    private Int32 m_numBits;


    public BitArrary(Int32 numBits)
    {
        if (numBits <= 0)
            throw new ArgumentOutOfRangeException("Must be greater then 0");

        m_numBits = numBits;
        m_byteArray = new Byte[(numBits + 7) / 8];
    }

    public Boolean this[Int32 bitPos]
    {
        get
        {
            if ((bitPos < 0) || (bitPos >= m_numBits))
            {
                throw new ArgumentOutOfRangeException("bitPos");
            }
            else
            {
                return (m_byteArray[bitPos / 8] & (1 << (bitPos % 8))) != 0;
            }
        }
        set
        {
            if ((bitPos < 0) || (bitPos > m_numBits))
                throw new ArgumentOutOfRangeException("bitPos");
            if (value)
            {
                m_byteArray[bitPos / 8] = (Byte)(m_byteArray[bitPos / 8] | (1 << (bitPos % 8)));
            }
            else
            {
                m_byteArray[bitPos / 8] = (Byte)(m_byteArray[bitPos / 8] & ~(1 << (bitPos % 8)));
            }
        }
    }

}

ビットの操作がある部分 (3 行) がわかりません。私が得る限り、最初のものでは、そのANDingビットがオンになっているかどうかを確認するためのビット配列の値です。2 つORing目は 、3 つ目はANDingNOT、この 3 行で起こっていることはほぼ正しいでしょうか?

これが何をしているのか、私の脳を本当に傷つけているのは何1 << (bitPos % 8)ですか?そして、それを使って何ANDingをするのでしょうかORing? 私が知っているのは、何かの値を左または右に変更できるということです (またはその他、これについてはよくわかりません)。それはシフトですか?ANDingNOT1

誰でも説明できますか?

EDIT:完全なコードのために編集...

4

2 に答える 2

2

わかりました、これはバイト (m_byteArray) を含むプライベート フィールドであり、これは bytearray からビットを取得するように見えます (bytearray は連続しており、これは特定の位置からビットを取得しようとしていると想定しています - たとえば、3 つあると想像してくださいバイト、位置 13 はバイト 2 からビット 5 を取得します)

編集:よりよく要約するには

バイト配列に 3 バイトある画像

00101011 00101010 01000010

ビット 13 が必要な場合は、'12' をインデクサーに渡します

00101011 00101010 01000010
-------------^
(Remember it's 0 based)

私達は行く

m_byteArray[12 / 8] (12 / 8 = 1 so we know we want byte number two at index 1 - byte array is also zero based!)

したがって、2番目のバイトがあります(インデックス1)

00101010
----^

さあ行きましょう

00101010 & (1 << (12 % 8))

これはに相当します

00101010 & 00000001 << 4

どれが

00101010 & 00001000

したがって、これは

1 & 1

1を返します:)

最終的にマスクの場合

1 & 0

論理的には 0 を返します

于 2012-07-28T14:02:41.303 に答える
1

この線:

return (m_byteArray[bitPos / 8] & (1 << (bitPos % 8))) != 0;

バイト配列の n 番目のビットが設定されているかどうかを返します。

bitPos / 8

インデックス付きビットが入っているバイトを見つけ、

1 << (bitPos % 8))

関連するバイトのビットマスクを作成します。

例として、10 番目のビットが設定されているかどうかを調べたい場合は、bitPos9. bitPos / 8= 1 になるため、関連するビットは配列内の 2 番目のバイトにあります。 bitPos % 8= 1 なので、式 (1 << (bitPos % 8)) は のビットマスクを作成し00000010ます。このマスクを に適用するbyteArray[1]と、2 番目のビットが設定されている場合は 1 が返され、それ以外の場合は 0 が返されます。

セッターのロジックは似ていますが、次の点が異なります。

m_byteArray[bitPos / 8] | (1 << (bitPos % 8))

関連付けられた位置にビットを設定しますが、

(m_byteArray[bitPos / 8] & ~(1 << (bitPos % 8))

クリアします。

于 2012-07-28T14:03:10.627 に答える