私は一生懸命努力しましたが、このコードで何が起こっているのか理解できないようです。誰でも光を当てることができますか?
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 つ目はANDing
でNOT
、この 3 行で起こっていることはほぼ正しいでしょうか?
これが何をしているのか、私の脳を本当に傷つけているのは何1 << (bitPos % 8)
ですか?そして、それを使って何ANDing
をするのでしょうかORing
? 私が知っているのは、何かの値を左または右に変更できるということです (またはその他、これについてはよくわかりません)。それはシフトですか?ANDing
NOT
1
誰でも説明できますか?
EDIT:完全なコードのために編集...