diff --git a/include/etl/private/bitset_new.h b/include/etl/private/bitset_new.h index dda27010..fc387cd7 100644 --- a/include/etl/private/bitset_new.h +++ b/include/etl/private/bitset_new.h @@ -507,7 +507,7 @@ namespace etl { // Where to start. size_t index = position >> log2::value; - size_t bit = position; + size_t bit = position & (Bits_Per_Element - 1); element_type mask = 1 << bit; diff --git a/test/test_bitset_legacy.cpp b/test/test_bitset_legacy.cpp index 92982e49..6421370a 100644 --- a/test/test_bitset_legacy.cpp +++ b/test/test_bitset_legacy.cpp @@ -1246,6 +1246,22 @@ namespace CHECK_EQUAL(etl::ibitset::npos, bits24.find_next(true, 13)); } + //************************************************************************* + TEST(test_find_next_github_issue_617) + { + etl::bitset<64> bs1(0xC000'0000'0000'0031ULL); + size_t bs1fnt1 = bs1.find_next(true, 10); + size_t bs1fnt2 = bs1.find_next(true, 59); + CHECK_EQUAL(62U, bs1fnt1); + CHECK_EQUAL(62U, bs1fnt2); + + etl::bitset<64> bs2(0x3FFF'FFFF'FFFF'FFCEULL); + size_t bs2fnf1 = bs2.find_next(false, 10); + size_t bs2fnf2 = bs2.find_next(false, 59); + CHECK_EQUAL(62U, bs2fnf1); + CHECK_EQUAL(62U, bs2fnf2); + } + //************************************************************************* TEST(test_swap) { diff --git a/test/test_bitset_new_default_element_type.cpp b/test/test_bitset_new_default_element_type.cpp index e3d46d5a..7519dcb5 100644 --- a/test/test_bitset_new_default_element_type.cpp +++ b/test/test_bitset_new_default_element_type.cpp @@ -1952,6 +1952,28 @@ namespace CHECK_EQUAL(4U, bs4fnt1); } + //************************************************************************* + TEST(test_find_next_github_issue_617) + { + constexpr etl::bitset<64> bs1(ull(0xC000'0000'0000'0031)); + constexpr size_t bs1fnt1 = bs1.find_next(true, 10); + constexpr size_t bs1fnt2 = bs1.find_next(true, 59); + CHECK_EQUAL(62U, bs1fnt1); + CHECK_EQUAL(62U, bs1fnt2); + + constexpr etl::bitset<64> bs2(ull(0x3FFF'FFFF'FFFF'FFCE)); + constexpr size_t bs2fnf1 = bs2.find_next(false, 10); + constexpr size_t bs2fnf2 = bs2.find_next(false, 59); + CHECK_EQUAL(62U, bs2fnf1); + CHECK_EQUAL(62U, bs2fnf2); + + constexpr etl::bitset<64, uint32_t> bs32(ull(0xC000'0000'0000'0031)); + constexpr size_t bs32fnt1 = bs32.find_next(true, 10); + constexpr size_t bs32fnt2 = bs32.find_next(true, 59); + CHECK_EQUAL(62U, bs32fnt1); + CHECK_EQUAL(62U, bs32fnt2); + } + //************************************************************************* //************************************************************************* TEST(test_swap) diff --git a/test/test_bitset_new_ext_default_element_type.cpp b/test/test_bitset_new_ext_default_element_type.cpp index d877eb29..e19c15c9 100644 --- a/test/test_bitset_new_ext_default_element_type.cpp +++ b/test/test_bitset_new_ext_default_element_type.cpp @@ -1796,6 +1796,25 @@ namespace CHECK_EQUAL(4U, bs4fnt1); } + //************************************************************************* + TEST(test_find_next_github_issue_617) + { + etl::bitset_ext<64>::element_type buffer1[etl::bitset_ext<64>::Number_Of_Elements]; + etl::bitset_ext<64>::element_type buffer2[etl::bitset_ext<64>::Number_Of_Elements]; + + etl::bitset_ext<64> bs1(ull(0xC000'0000'0000'0031), buffer1); + size_t bs1fnt1 = bs1.find_next(true, 10); + size_t bs1fnt2 = bs1.find_next(true, 59); + CHECK_EQUAL(62U, bs1fnt1); + CHECK_EQUAL(62U, bs1fnt2); + + etl::bitset_ext<64> bs2(ull(0x3FFF'FFFF'FFFF'FFCE), buffer2); + size_t bs2fnf1 = bs2.find_next(false, 10); + size_t bs2fnf2 = bs2.find_next(false, 59); + CHECK_EQUAL(62U, bs2fnf1); + CHECK_EQUAL(62U, bs2fnf2); + } + //************************************************************************* TEST(test_swap) {