Power-of-Two Indexing: Bitwise AND vs operator%

Question 6 / 51 Correct so far: 0 (0 answered)

Snippet A

Bitwise And

std::uint64_t sumBuckets(const std::vector<std::uint32_t>& data) {
    const std::uint32_t mask = runtimeCapacity() - 1;
    std::uint64_t sum = 0;
    for (std::uint32_t x : data)
        sum += x & mask;
    return sum;
}

std::uint64_t result = sumBuckets(DATA);
Snippet B

Modulo Op

std::uint64_t sumBuckets(const std::vector<std::uint32_t>& data) {
    const std::uint32_t capacity = runtimeCapacity();
    std::uint64_t sum = 0;
    for (std::uint32_t x : data)
        sum += x % capacity;
    return sum;
}

std::uint64_t result = sumBuckets(DATA);
Shared test data (shared-setup)
constexpr std::uint32_t kCapacity = 8192;
constexpr std::uint32_t kMask = kCapacity - 1;
constexpr int kDataSize = 65536;

static std::uint32_t runtimeCapacity() {
    static volatile std::uint32_t capacity = kCapacity;
    return capacity;
}

static std::vector<std::uint32_t> makeData() {
    std::vector<std::uint32_t> v(kDataSize);
    for (int i = 0; i < kDataSize; ++i)
        v[i] = static_cast<std::uint32_t>(i * 2654435761u);
    return v;
}

static const std::vector<std::uint32_t> DATA = makeData();

Which snippet is faster?

Select the correct answer(s)