0% found this document useful (0 votes)
7 views

Lesson 05 Macro and BitManipulation

Uploaded by

trandaoanhtrung
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
7 views

Lesson 05 Macro and BitManipulation

Uploaded by

trandaoanhtrung
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 23

C Fundamentals

Macro and
Bit Manipulation

FSA,HoChiMinh

1
1 Macro
Table of
Contents 2 Bitwise Operations

3 Bit Fields

2
Macro

3
Macro
 Macro definition
 Object-like Macros
 Function-like Macros
 Stringification and Concatenation
 Undefining and Redefining Macros
4
Macro Definition
 What is macro
A macro is a fragment of code which has been given a name. Whenever
the name is used, it is replaced by the contents of the macro
Macro is defined using #define preprocessor directive in the C
language.
 When to use
When creating constants that represent numbers, strings or expressions.

5
Macro Definition
 Macro classification
• Predefined macro
• User-defined macro

6
Object-like macros
#define MACRO_NAME macro’s body
An object-like macro is a simple identifier which will be replaced by a code fragment. It is
called object-like because it looks like a data object in code that uses it. They are most
commonly used to give symbolic names to numeric constants.
 Give symbolic names to numeric constants
 The macro’s body end at the end of the #define line
 Single line macro:
#define SIZE 10
Upper case
 Multiple line macro:
#define NUMBERS 1, \
2
7
Function-like macros
#define macro_name(list of parameters) macro’s body
Also define macros whose use looks like a function
Lower call. These are called function-like macros.
case No white
space extern void foo(void);
#define foo() /* optimized inline version */
#define min(X, Y) ((X) < (Y) ? (X) : (Y))
#define f () callback()
x = min(a, b); ==> x = ((a) < (b) ? (a) : (b)); ...
?
y = min(1, 2); ==> y = ((1) < (2) ? (1) : (2)); foo();  ?
funcptr = foo;  ?
f()  ?
8
Stringification and token pasting
struct command {
char *name;
Token pasting
void (*function) (void);
preprocessing
};
operator
#define COMMAND(NAME) { #NAME, NAME ##
_command }
struct command commands[] = {
COMMAND (quit),
COMMAND (help),
}; Stringification
struct command commands[] = { preprocessing
{ "quit", quit_command }, operator
{ "help", help_command },
};
9
Undefining and Redefining
Macros

#ifdef TRUE

#undef TRUE

#define TRUE 1

#endif

10
BITWISE OPERATION (1)
Symbol Operation
bit a bit b a&b a|b a^b

& bitwise AND 0 0 0 0 0

| bitwise inclusive OR 0 1 0 1 1

1 0 0 1 1
^ bitwise XOR (eXclusive OR)
1 1 1 1 0
<< Left shift
bit a ~a
>> Right shift
0 1
~ bitwise NOT (one's complement)
(unary) 1 0

11
Bitwise
Operations

12
BITWISE OPERATION (2)
Shift operations

A <<3 Bit7 Bit6 Bit5 Bit4 Bit3 0 0 0 0

A >> 3 0 0 0 0 Bit5 Bit4 Bit3 Bit2 Bit0

13
BITWISE OPERATION (3)
#include <stdio.h>
void main() {
unsigned int a = 60; /* 60 = 0011 1100 */
unsigned int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */ OUTPUT:
printf("Line 1 - Value of c is %d\n", c ); Line 1 - Value of c is 12
c = a | b; /* 61 = 0011 1101 */ Line 2 - Value of c is 61
printf("Line 2 - Value of c is %d\n", c );
c = a ^ b; /* 49 = 0011 0001 */
Line 3 - Value of c is 49
printf("Line 3 - Value of c is %d\n", c ); Line 4 - Value of c is -61
c = ~a; /*-61 = 1100 0011 */ Line 5 - Value of c is 240
printf("Line 4 - Value of c is %d\n", c ); Line 6 - Value of c is 15
c = a << 2; /* 240 = 1111 0000 */
printf("Line 5 - Value of c is %d\n", c );
c = a >> 2; /* 15 = 0000 1111 */
printf("Line 6 - Value of c is %d\n", c );
}
14
Bit Fields

15
Bit Fields - 1
 This structure requires 8 bytes of memory space but in actual, we are
going to store either 0 or 1 in each of the variables. The C programming
language offers a better way to utilize the memory space in such
situations.

struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status;

16
Bit Fields - 2

struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status;
 The above structure requires 4 bytes of memory space for status variable, but only 2 bits will be used
to store the values.
 If you will use up to 32 variables each one with a width of 1 bit, then also the status structure will use 4
bytes. However as soon as you have 33 variables, it will allocate the next slot of the memory and it will
start using 8 bytes.

17
Bit Fields - 3
#include <stdio.h>
#include <string.h>
/* define simple structure */
struct {
unsigned int widthValidated;
unsigned int heightValidated;
} status1; OUTPUT:
/* define a structure with bit fields */
struct {
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status2;
int main( ) {
printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
printf( "Memory size occupied by status2 : %d\n", sizeof(status2));
return 0;
}

18
Bit Field Declaration - 1

 The declaration of a bit-field has the following


form inside a structure:

19
Bit Field Declaration - 2
 The following table describes the variable elements of a bit field:

20
Quiz(1)

The figure show the description of register PCR.

1. Write macros to define MASK and SHIFT location of each bit field.

2. Write macro to set IRQC to 3

21
Quiz(2)

 Write macro to convert 32bit value from big endian to little


endian form

22
Thank you
Q&A

23

You might also like