12#ifndef BOTAN_BIT_OPS_H_
13#define BOTAN_BIT_OPS_H_
15#include <botan/types.h>
25 return static_cast<T>(0) - (a >> (
sizeof(
T)*8-1));
34 return expand_top_bit<T>(~x & (x - 1));
45 return (arg != 0) && (arg != 1) && ((arg &
static_cast<T>(arg-1)) == 0);
59 for(
size_t s = 8*
sizeof(
T) / 2; s > 0; s /= 2)
61 const size_t z = s * ((~ct_is_zero(n >> s)) & 1);
81 for(
size_t s = 8*
sizeof(n) / 2; s >= 8; s /= 2)
83 const size_t z = s * (~ct_is_zero(n >> s) & 1);
99inline constexpr size_t ctz(
T n)
107 for(
size_t s = 8*
sizeof(
T) / 2; s > 0; s /= 2)
109 const T mask = (
static_cast<T>(1) << s) - 1;
110 const size_t z = s * (
ct_is_zero(n & mask) & 1);
121 static_assert(
sizeof(
T) < 32,
"Abnormally large scalar");
123 if(x >> (
sizeof(
T)*8-1))
141#if defined(BOTAN_BUILD_COMPILER_IS_GCC) || defined(BOTAN_BUILD_COMPILER_IS_CLANG)
144 return __builtin_ctz(n);
146 return ctz<uint32_t>(n);
157 const T swap = ((x >> shift) ^ x) & mask;
158 return (x ^ swap) ^ (swap << shift);
164 const T swap = ((x >> shift) ^ y) & mask;
173 return (
b ^ (mask & (a ^
b)));
constexpr size_t ctz(T n)
constexpr uint8_t ceil_log2(T x)
constexpr size_t var_ctz32(uint32_t n)
constexpr T choose(T mask, T a, T b)
constexpr size_t high_bit(T n)
constexpr void swap_bits(T &x, T &y, T mask, size_t shift)
constexpr T majority(T a, T b, T c)
constexpr size_t significant_bytes(T n)
constexpr T ct_is_zero(T x)
constexpr bool is_power_of_2(T arg)
constexpr T bit_permute_step(T x, T mask, size_t shift)
constexpr T expand_top_bit(T a)