/* SPDX-License-Identifier: GPL-2.0-or-later */
/* Integer base 2 logarithm calculation
*
* Copyright ( C ) 2006 Red Hat , Inc . All Rights Reserved .
* Written by David Howells ( dhowells @ redhat . com )
*/
#ifndef _TOOLS_LINUX_LOG2_H
#define _TOOLS_LINUX_LOG2_H
#include <linux/bitops.h>
#include <linux/types.h>
/*
* non - constant log of base 2 calculators
* - the arch may override these in asm / bitops . h if they can be implemented
* more efficiently than using fls ( ) and fls64 ( )
* - the arch is not required to handle n = = 0 if implementing the fallback
*/
static inline __attribute__((const ))
int __ilog2_u32(u32 n)
{
return fls(n) - 1 ;
}
static inline __attribute__((const ))
int __ilog2_u64(u64 n)
{
return fls64(n) - 1 ;
}
/*
* Determine whether some value is a power of two , where zero is
* * not * considered a power of two .
*/
static inline __attribute__((const ))
bool is_power_of_2(unsigned long n)
{
return (n != 0 && ((n & (n - 1 )) == 0 ));
}
/*
* round up to nearest power of two
*/
static inline __attribute__((const ))
unsigned long __roundup_pow_of_two(unsigned long n)
{
return 1 UL << fls_long(n - 1 );
}
/*
* round down to nearest power of two
*/
static inline __attribute__((const ))
unsigned long __rounddown_pow_of_two(unsigned long n)
{
return 1 UL << (fls_long(n) - 1 );
}
/**
* ilog2 - log of base 2 of 32 - bit or a 64 - bit unsigned value
* @ n - parameter
*
* constant - capable log of base 2 calculation
* - this can be used to initialise global variables from constant data , hence
* the massive ternary operator construction
*
* selects the appropriately - sized optimised version depending on sizeof ( n )
*/
#define ilog2(n) \
( \
__builtin_constant_p(n) ? ( \
(n) < 2 ? 0 : \
(n) & (1 ULL << 63 ) ? 63 : \
(n) & (1 ULL << 62 ) ? 62 : \
(n) & (1 ULL << 61 ) ? 61 : \
(n) & (1 ULL << 60 ) ? 60 : \
(n) & (1 ULL << 59 ) ? 59 : \
(n) & (1 ULL << 58 ) ? 58 : \
(n) & (1 ULL << 57 ) ? 57 : \
(n) & (1 ULL << 56 ) ? 56 : \
(n) & (1 ULL << 55 ) ? 55 : \
(n) & (1 ULL << 54 ) ? 54 : \
(n) & (1 ULL << 53 ) ? 53 : \
(n) & (1 ULL << 52 ) ? 52 : \
(n) & (1 ULL << 51 ) ? 51 : \
(n) & (1 ULL << 50 ) ? 50 : \
(n) & (1 ULL << 49 ) ? 49 : \
(n) & (1 ULL << 48 ) ? 48 : \
(n) & (1 ULL << 47 ) ? 47 : \
(n) & (1 ULL << 46 ) ? 46 : \
(n) & (1 ULL << 45 ) ? 45 : \
(n) & (1 ULL << 44 ) ? 44 : \
(n) & (1 ULL << 43 ) ? 43 : \
(n) & (1 ULL << 42 ) ? 42 : \
(n) & (1 ULL << 41 ) ? 41 : \
(n) & (1 ULL << 40 ) ? 40 : \
(n) & (1 ULL << 39 ) ? 39 : \
(n) & (1 ULL << 38 ) ? 38 : \
(n) & (1 ULL << 37 ) ? 37 : \
(n) & (1 ULL << 36 ) ? 36 : \
(n) & (1 ULL << 35 ) ? 35 : \
(n) & (1 ULL << 34 ) ? 34 : \
(n) & (1 ULL << 33 ) ? 33 : \
(n) & (1 ULL << 32 ) ? 32 : \
(n) & (1 ULL << 31 ) ? 31 : \
(n) & (1 ULL << 30 ) ? 30 : \
(n) & (1 ULL << 29 ) ? 29 : \
(n) & (1 ULL << 28 ) ? 28 : \
(n) & (1 ULL << 27 ) ? 27 : \
(n) & (1 ULL << 26 ) ? 26 : \
(n) & (1 ULL << 25 ) ? 25 : \
(n) & (1 ULL << 24 ) ? 24 : \
(n) & (1 ULL << 23 ) ? 23 : \
(n) & (1 ULL << 22 ) ? 22 : \
(n) & (1 ULL << 21 ) ? 21 : \
(n) & (1 ULL << 20 ) ? 20 : \
(n) & (1 ULL << 19 ) ? 19 : \
(n) & (1 ULL << 18 ) ? 18 : \
(n) & (1 ULL << 17 ) ? 17 : \
(n) & (1 ULL << 16 ) ? 16 : \
(n) & (1 ULL << 15 ) ? 15 : \
(n) & (1 ULL << 14 ) ? 14 : \
(n) & (1 ULL << 13 ) ? 13 : \
(n) & (1 ULL << 12 ) ? 12 : \
(n) & (1 ULL << 11 ) ? 11 : \
(n) & (1 ULL << 10 ) ? 10 : \
(n) & (1 ULL << 9 ) ? 9 : \
(n) & (1 ULL << 8 ) ? 8 : \
(n) & (1 ULL << 7 ) ? 7 : \
(n) & (1 ULL << 6 ) ? 6 : \
(n) & (1 ULL << 5 ) ? 5 : \
(n) & (1 ULL << 4 ) ? 4 : \
(n) & (1 ULL << 3 ) ? 3 : \
(n) & (1 ULL << 2 ) ? 2 : \
1 ) : \
(sizeof (n) <= 4 ) ? \
__ilog2_u32(n) : \
__ilog2_u64(n) \
)
/**
* roundup_pow_of_two - round the given value up to nearest power of two
* @ n - parameter
*
* round the given value up to the nearest power of two
* - the result is undefined when n = = 0
* - this can be used to initialise global variables from constant data
*/
#define roundup_pow_of_two(n) \
( \
__builtin_constant_p(n) ? ( \
(n == 1 ) ? 1 : \
(1 UL << (ilog2((n) - 1 ) + 1 )) \
) : \
__roundup_pow_of_two(n) \
)
/**
* rounddown_pow_of_two - round the given value down to nearest power of two
* @ n - parameter
*
* round the given value down to the nearest power of two
* - the result is undefined when n = = 0
* - this can be used to initialise global variables from constant data
*/
#define rounddown_pow_of_two(n) \
( \
__builtin_constant_p(n) ? ( \
(1 UL << ilog2(n))) : \
__rounddown_pow_of_two(n) \
)
#endif /* _TOOLS_LINUX_LOG2_H */
Messung V0.5 in Prozent C=95 H=100 G=97
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-09-28)
¤
*© Formatika GbR, Deutschland