【问题标题】:shifting the bits. What's happening in this code?移位位。这段代码发生了什么?
【发布时间】:2012-07-26 22:41:42
【问题描述】:

我已经很努力了,但我似乎无法理解这段代码中发生了什么。任何人都可以解释一下吗?

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,第三个是ANDingNOT,我认为这三行中发生的事情是正确的吗?

1 &lt;&lt; (bitPos % 8)1 &lt;&lt; (bitPos % 8) 到底在做什么? ANDingORingANDing 和其中的 NOT 会做什么?我所知道的是,您可以左右拉屎某物的价值(或其他,我对此不是很清楚。)那么这是做什么的呢?是 shift 1 还是什么?

谁能解释一下?

编辑:已编辑完整代码...

【问题讨论】:

  • 看起来像一个索引属性来返回一个字节的位,为每个位位置返回真/假(分别设置/取消设置),我将发布一个带有详细信息的答案:)
  • 看到这个帖子:link

标签: c# arrays boolean bit-manipulation bit-shift


【解决方案1】:

Ok 看起来是一个包含字节 (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!)

所以我们有了第二个字节(在索引 1 处)

00101010
----^

现在开始

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

相当于

00101010 & 00000001 << 4

这是

00101010 & 00001000

所以这掩盖了

1 & 1

返回 1 :)

对于以

结尾的掩码
1 & 0

逻辑上返回 0

【讨论】:

  • 我已经更新了问题以包含完整的代码。虽然非常感谢您提供了如此好的解释.. :)
  • 对不起,我觉得第一次有点混乱,我已经通过逐步说明字节来澄清它
【解决方案2】:

行:

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

返回是否设置了字节数组中的第 n 位。

bitPos / 8

找到索引位所在的字节,并且

1 << (bitPos % 8))

为相关字节创建一个位掩码。

例如,如果您想查找第 10 位是否已设置,bitPos 将是 9。 bitPos / 8 = 1,因此相关位在数组的第二个字节中。 bitPos % 8 = 1,因此表达式 (1 00000010 的位掩码。如果设置了第二个位,则将此掩码应用于byteArray[1] 将返回 1,否则返回 0。

setter 的逻辑类似,除了

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

将在相关位置设置位,而

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

将清除它。

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 2018-07-28
    • 1970-01-01
    • 2012-08-29
    • 2014-11-12
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多