Удобные макросы для работы с двоичными числами

Вс 13 Декабрь 2009 by levap

Часто при программировании микроконтроллеров (да и не только) бывает удобно вводить числа в двоичном формате. Предлагаю вашему вниманию удобные макросы, которые позволяют использовать 8-, 16- и 32-битные числа в двоичном формате.

Посмотреть код:

[c]#ifndef _CONVERT_H_
#define _CONVERT_H_

#include <stdint.h>

#define HEX__(n) 0x##n##LU

// 8-bit conversion function
#define B8__(x) ((x&0x0000000FLU)?1:0) \
+((x&0x000000F0LU)?2:0) \
+((x&0x00000F00LU)?4:0) \
+((x&0x0000F000LU)?8:0) \
+((x&0x000F0000LU)?16:0) \
+((x&0x00F00000LU)?32:0) \
+((x&0x0F000000LU)?64:0) \
+((x&0xF0000000LU)?128:0)
// For upto 8-bit binary constants
#define B8(d) ((uint8_t)B8__(HEX__(d)))
// For upto 16-bit binary constants, MSB first
#define B16(dmsb, dlsb) (((uint16_t)B8(dmsb)<<8) \
+ B8(dlsb))
// For upto 32-bit binary constants, MSB first
#define B32(dmsb,db2,db3,dlsb) (((uint32_t)B8(dmsb)<<24) \
+ ((uint32_t)B8(db2)<<16) \
+ ((uint32_t)B8(db3)<<8) \
+ B8(dlsb))
// Sample usage:
// B8(01010101) = 85
// B16(10101010,01010101) = 43605
// B32(10000000,11111111,10101010,01010101) = 2164238933
#endif
[/c]