native 0.0.1
Vectors, masks and wide register packs for C++26
Loading...
Searching...
No Matches
crc.h
1// SPDX-License-Identifier: BSD-2-Clause OR Apache-2.0
2#pragma once
3#include <cstdint>
4
5namespace native::detail {
6 // Uncomplemented reflected CRC update, consuming exactly bits low input bits.
7 constexpr std::uint32_t crc_update(std::uint32_t accumulator, std::uint64_t value,
8 unsigned bits, std::uint32_t polynomial) noexcept {
9 for(unsigned bit=0;bit<bits;++bit) {
10 auto feedback=(accumulator^static_cast<std::uint32_t>(value))&1u;
11 accumulator=(accumulator>>1)^(feedback?polynomial:0u);
12 value>>=1;
13 }
14 return accumulator;
15 }
16}