#include <stdio.h>
#include <stdint.h>
void print_bits(size_t const size, void const * const ptr)
{
unsigned char *b = (unsigned char*) ptr;
unsigned char byte;
int i, j;
for (i = size - 1; i >= 0; --i)
{
for (j=7; j>=0; --j)
{
byte = b[i] & (1<<j);
byte >>= j;
printf("%u", byte);
}
printf(" ");
}
puts("");
}
/* To split numbers into Little Endian format */
#define WORD_CHARS(x) (x&0xff), ((x>>8)&0xff), ((x>>16)&0xff), ((x>>24)&0xff)
#define SHORT_CHARS(x) (x&0xff), ((x>>8)&0xff)
int test_bit_shifting(void) {
// form uint32_t having uint8_t
uint8_t v4[4] = {1, 2, 3, 4};
uint32_t i32_00 = v4[0] | (v4[1] << 8) | (v4[2] << 16) | (v4[3] << 24);
print_bits(4, &i32_00);
// form uint32_t having uint8_t
uint32_t i32_01 = 0;
i32_01 |= (v4[0] << 0);
i32_01 |= (v4[1] << 8);
i32_01 |= (v4[2] << 16);
i32_01 |= (v4[3] << 24);
print_bits(4, &i32_01);
// form uint32_t having uint8_t
uint32_t i32_02 = 0;
uint8_t b1 = 1;
uint8_t b2 = 2;
uint8_t b3 = 3;
uint8_t b4 = 4;
i32_02 |= (b1 << 0);
i32_02 |= (b2 << 8);
i32_02 |= (b3 << 16);
i32_02 |= (b4 << 24);
print_bits(4, &i32_02);
// form uint32_t having uint8_t & uint16_t
uint32_t i32_03 = 0;
uint8_t b11 = 1;
uint8_t b22 = 2;
uint16_t b33 = 3;
i32_03 |= (b11 << 0);
i32_03 |= (b22 << 8);
i32_03 |= (b33 << 16);
print_bits(4, &i32_03);
uint8_t b222 = 2;
b222 = b222 << 8;
print_bits(1, &b222);
return 0;
}
void test_bit_set_clear()
{
#define BIT_SET(a,b) ((a) |= (1<<(b)))
#define BIT_CLEAR(a,b) ((a) &= ~(1<<(b)))
#define BIT_FLIP(a,b) ((a) ^= (1<<(b)))
#define BIT_CHECK(a,b) ((a) & (1<<(b)))
uint8_t a = 0;
/* set bit */
a |= (1 << 1);
print_bits(1, &a);
/* clear bit */
a &= ~(1 << 1);
print_bits(1, &a);
/* flip bit */
a ^= (1 << 1);
print_bits(1, &a);
uint8_t res = a & (1 << 0);
if (res)
printf("bit is set: res: %d\n", res);
else
printf("bit is not set: res: %d\n", res);
uint16_t wMaxPacketSize = 1024 | 0x1000;
/* set bit */
print_bits(2, &wMaxPacketSize);
}
int main()
{
test_bit_set_clear();
return 0;
}