Skip to content

BitArray ShiftLeft and PopCount produce unexpected behavior #123281

@vcsjones

Description

@vcsjones

Consider:

[Fact]
public static void PopCount_LeftShiftLeavesDanglingBits()
{
    BitArray ba = new(33);
    ba[^1] = true;

    Assert.True(ba.HasAnySet());
    Assert.Equal(1, ba.PopCount());

    ba = ba.LeftShift(1);
    Assert.False(ba.HasAnySet());
    Assert.Equal(0, ba.PopCount()); // Fails here
}

This test will fail. Despite HasAnySet returning false, PopCount will return 1.

Likewise manually counting the bits will disagree with PopCount

[Fact]
public static void PopCount_LeftShiftLeavesDanglingBits()
{
    BitArray ba = new(33);
    ba[^1] = true;

    Assert.Equal(ManualCountBits(ba), ba.PopCount());

    ba = ba.LeftShift(1);
    Assert.False(ba.HasAnySet());
    Assert.Equal(ManualCountBits(ba), ba.PopCount());


    static int ManualCountBits(BitArray ba)
    {
        int count = 0;

        foreach (bool bit in ba)
        {
            if (bit)
            {
                count++;
            }
        }

        return count;
    }
}

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions