/
bitarithm.h
140 lines (128 loc) · 3.52 KB
/
bitarithm.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
* Copyright (C) 2014 Freie Universität Berlin
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License. See the file LICENSE in the top level directory for more
* details.
*/
/**
* @addtogroup core_util
* @{
*
* @file bitarithm.h
* @brief Helper functions for bit arithmetic
*
* @author Freie Universität Berlin, Computer Systems & Telematics
* @author Kaspar Schleiser <kaspar@schleiser.de>
* @author Martin Lenders <mlenders@inf.fu-berlin.de>
*/
#ifndef BITARITHM_H_
#define BITARITHM_H_
/** @def BS
* @brief Sets a bitmask
* @param[in] val The value to which the bitmask will be applied
* @param[in] bit The bitmask to be set
*
* @return The applied bitmask
*/
#define BS(val, bit) ((val) & (bit))
/**
* @def BS_COND
* @brief Conditional setting of a bitmask
*
* @param[in] condition The condition to be checked
* @param[in] target The value to which the bitmask will be applied
* @param[in] mask The bitmask to be set
*
* @return The applied bitmask if *condition* is true
*/
#define BS_COND(condition, target, mask) (target) ^= ( (-(condition) ^ (target)) & (mask) )
/**
* @def SETBIT
* @brief Sets a bitbitmask for a bitfield
*
* @param[in] val The bitfield
* @param[in] bit Specifies the bits to be set
*
* @return The modified bitfield
*/
#define SETBIT(val, bit) val |= (bit)
/**
* @def CLRBIT
* @brief Clears bitmask for a bitfield
*
* @param[in] val The bitfield
* @param[in] bit Specifies the bits to be cleared
*
* @return The modified bitfield
*/
#define CLRBIT(val, bit) val &= (~(bit))
/**
* @name Single Bit Defines
* @{
*/
#ifndef BIT0
#define BIT0 0x00000001
#define BIT1 0x00000002
#define BIT2 0x00000004
#define BIT3 0x00000008
#define BIT4 0x00000010
#define BIT5 0x00000020
#define BIT6 0x00000040
#define BIT7 0x00000080
#define BIT8 0x00000100
#define BIT9 0x00000200
#define BIT10 0x00000400
#define BIT11 0x00000800
#define BIT12 0x00001000
#define BIT13 0x00002000
#define BIT14 0x00004000
#define BIT15 0x00008000
#endif
#ifndef BIT16
#define BIT16 0x00010000
#define BIT17 0x00020000
#define BIT18 0x00040000
#define BIT19 0x00080000
#define BIT20 0x00100000
#define BIT21 0x00200000
#define BIT22 0x00400000
#define BIT23 0x00800000
#define BIT24 0x01000000
#define BIT25 0x02000000
#define BIT26 0x04000000
#define BIT27 0x08000000
#define BIT28 0x10000000
#define BIT29 0x20000000
#define BIT30 0x40000000
#define BIT31 0x80000000
#endif
/** @} */
#define ARCH_32_BIT (__INT_MAX__ == 2147483647) /**< 1 for 32 bit architectures, 0 otherwise */
/**
* @brief Returns the number of the highest '1' bit in a value
* @param[in] v Input value
* @return Bit Number
*
* Source: http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious
*/
unsigned number_of_highest_bit(unsigned v);
/**
* @brief Returns the number of the lowest '1' bit in a value
* @param[in] v Input value - must be unequal to '0', otherwise the
* function will produce an infinite loop
* @return Bit Number
*
* Source: http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious
*/
unsigned number_of_lowest_bit(register unsigned v);
/**
* @brief Returns the number of bits set in a value
* @param[in] v Input value
* @return Number of set bits
*
* Source: http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious
*/
unsigned number_of_bits_set(unsigned v);
#endif /* BITARITHM_H_ */
/** @} */