我已经很努力了,但我似乎无法理解这段代码中发生了什么。任何人都可以阐明一下吗?
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)));
}
}
}
}
我没有得到对位进行操作的部分(三行)。据我所知,在第一个中,它ANDing
是位数组的值,以查找该位是否打开。在第二个中,它ORing
,在第三个ANDing
中NOT
,我认为这三行中发生的事情是正确的吗?
这是在做什么,真正伤害我的大脑的是什么1 << (bitPos % 8)
?以及它ANDing
的作用是什么ORing
?我所知道的是,您可以左右拉屎某物的价值(或其他,我对此不是很清楚。)那么这是做什么的呢?是转移还是什么?ANDing
NOT
1
谁能解释一下?
编辑:编辑完整代码...