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);
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;
T bit_permute_step(T x, T mask, size_t shift)
void swap_bits(T &x, T &y, T mask, size_t shift)
size_t var_ctz32(uint32_t n)
size_t significant_bytes(T n)
constexpr bool is_power_of_2(T arg)