Skip to content

Instantly share code, notes, and snippets.

@hans-jorg
Last active June 13, 2022 16:51
Show Gist options
  • Select an option

  • Save hans-jorg/8732831120aef23063fc to your computer and use it in GitHub Desktop.

Select an option

Save hans-jorg/8732831120aef23063fc to your computer and use it in GitHub Desktop.
Bit manipulation macros
#ifndef BITMANIP_H
#define BITMANIP_H
/**
* @brief Macros for bit and bitfields manipulation
*/
///@{
// Bit macro (LSB=0)
#define BIT(N) (1UL<<(N))
// Bit manipulation using masks
#define BITSET(V,M) (V)|=(M)
#define BITCLEAR(V,M) (V)&=~(M)
#define BITTOGGLE(V,M) (V)^=(M)
// Bit manipulation using indexes
#define BITSETN(V,N) (V)|=BIT(N)
#define BITCLEARN(V,N) (V)&=~BIT(N)
#define BITTOGGLEN(V,N) (V)^=BIT(N)
// Bit fields
#define BITVALUE(V,N) ((V)<<(N))
#define BITMASK(M,N) ((BIT((M)-(N)+1)-1)<<(N))
// Bit fields using masks
#define BITFIELDGET(VAR,MASK) ((VAR)&(MASK))
#define BITFIELDSET(VAR,MASK,VAL) (VAR) = ((VAR)&~(MASK))|(VAL)
// Bit fields using indexes (M > N)
#define BITFIELDMNSET(VAR,M,N,VAL) (VAR)=((VAR)&~(BITMASK((M),(N)))|BITVALUE((VAL),(N)))
#define BITFIELDMNGET(VAR,M,N) ((VAR)&(BITMASK((M),(N)))>>(N))
//@}
/**
* @brief Symbols for bits
*/
///@{
#define BIT0 1UL
#define BIT1 2UL
#define BIT2 4UL
#define BIT3 8UL
#define BIT4 16UL
#define BIT5 32UL
#define BIT6 64UL
#define BIT7 128UL
#define BIT8 256UL
#define BIT9 512UL
#define BIT10 1024UL
#define BIT11 2048UL
#define BIT12 4096UL
#define BIT13 8192UL
#define BIT14 16384UL
#define BIT15 32768UL
#define BIT16 65536UL
#define BIT17 131072UL
#define BIT18 262144UL
#define BIT19 524288UL
#define BIT20 1048576UL
#define BIT21 2097152UL
#define BIT22 4194304UL
#define BIT23 8388608UL
#define BIT24 16777216UL
#define BIT25 33554432UL
#define BIT26 67108864UL
#define BIT27 134217728UL
#define BIT28 268435456UL
#define BIT29 536870912UL
#define BIT30 1073741824UL
#define BIT31 2147483648UL
#endif // BITMANIP_H
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment