Sie sind auf Seite 1von 12

12,709,970 members (31,756 online)

Sign in

Search for articles, questions, tips

home

articles

quick answers

discussions

features

community

help

Articles Languages C / C++ Language Beginners

An introduction to bitwise operators


PJ Arends, 8 May 2002

CPOL

Rate this:

4.84 (179 votes)

This article gives a brief overview of C style bitwise operators

Introduction
I have noticed that some people seem to have problems with bitwise operators, so I decided to write this brief
tutorial on how to use them.

An Introduction to bits
Bits, what are they you may ask?
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Well, simply put, bits are the individual ones and zeros that make up every thing we do with computers. All the data
you use is stored in your computer using bits. A BYTE is made up of eight bits, a WORD is two BYTEs, or sixteen
bits. And a DWORD is two WORDS, or thirty two bits.
Hide Copy Code

0 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 0 0
||
|
|
|
||
|+- bit 31
|
|
|
bit 0 -+|
|
|
|
|
|
+-- BYTE 3 -----+--- BYTE 2 ----+--- BYTE 1 ----+-- BYTE 0 -----+
|
|
|
+----------- WORD 1 ------------+----------- WORD 0 ------------+
|
|
+--------------------------- DWORD -----------------------------+

The beauty of having bitwise operators is that you can use a BYTE, WORD or DWORD as a small array or
structure. Using bitwise operators you can check or set the values of individual bits or even a group of bits.

Hexadecimal numbers and how they relate to bits


When working with bits, it is kind of hard to express every number using just ones and zeros, which is known as
binary notation. To get around this we use hexadecimal (base 16) numbers.
As you may or may not know, it takes four bits to cover all the numbers from zero to fifteen, which also happens to
be the range of a single digit hexadecimal number. This group of four bits, or half a BYTE, is called a nibble. As
there are two nibbles in a BYTE, we can use two hexadecimal digits to show the value of one BYTE.
Hide Copy Code

NIBBLE
======
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001

HEX VALUE
=========
0
1
2
3
4
5
6
7
8
9

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

1001
1010
1011
1100
1101
1110
1111

9
A
B
C
D
E
F

So if we had one BYTE containing the letter 'r' (ASCII code 114) it would look like this:
Hide Copy Code

0111 0010
7
2

binary
hexadecimal

We could write it as '0x72'

Bitwise operators
There are six bitwise operators. They are:
& The AND operator
| The OR operator
^ The XOR operator
~ The Ones Complement or Inversion operator
>> The Right Shift operator
<< The Left Shift operator.

The & operator


The & (AND) operator compares two values, and returns a value that has its bits set if, and only if, the two values
being compared both have their corresponding bits set. The bits are compared using the following table
Hide Copy Code

1
1
0
0

&
&
&
&

1
0
1
0

==
==
==
==

1
0
0
0

An ideal use for this is to set up a mask to check the values of certain bits. Say we have a BYTE that contains some
open in browser PRO version Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

bit flags, and we want to check if bit four bit is set.


Hide Copy Code

BYTE b =
if ( b &
cout
else
cout

50;
0x10 )
<< "Bit four is set" << endl;
<< "Bit four is clear" << endl;

This would result in the following calculation


Hide Copy Code

00110010
& 00010000
---------00010000

- b
- & 0x10
- result

So we see that bit four is set.

The | operator
The | (OR) operator compares two values, and returns a value that has its bits set if one or the other values, or
both, have their corresponding bits set. The bits are compared using the following table
Hide Copy Code

1
1
0
0

|
|
|
|

1
0
1
0

==
==
==
==

1
1
1
0

An ideal use for this is to ensure that certain bits are set. Say we want to ensure that bit three of some value is set
Hide Copy Code

BYTE b = 50;
BYTE c = b | 0x04;
cout << "c = " << c << endl;

This would result in the following calculation


open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Hide Copy Code

00110010
| 00000100
---------00110110

- b
- | 0x04
- result

The ^ operator
The ^ (XOR) operator compares two values, and returns a value that has its bits set if one or the other value has its
corresponding bits set, but not both. The bits are compared using the following table
Hide Copy Code

1
1
0
0

^
^
^
^

1
0
1
0

==
==
==
==

0
1
1
0

An ideal use for this is to toggle certain bits. Say we want toggle the bits three and four
Hide Copy Code

BYTE b = 50;
cout << "b = " << b << endl;
b = b ^ 0x18;
cout << "b = " << b << endl;
b = b ^ 0x18;
cout << "b = " << b << endl;

This would result in the following calculations


Hide Copy Code

00110010
^ 00011000
---------00101010

- b
- ^ 0x18

00101010
^ 00011000
---------00110010

- b
- ^ 0x18

- result

- result

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

The ~ operator
The ~ (Ones Complement or inversion) operator acts only on one value and it inverts it, turning all the ones int
zeros, and all the zeros into ones. An ideal use of this would be to set certain bytes to zero, and ensuring all other
bytes are set to one, regardless of the size of the data. Say we want to set all the bits to one except bits zero and
one
Hide Copy Code

BYTE
cout
WORD
cout

b = ~0x03;
<< "b = " << b << endl;
w = ~0x03;
<< "w = " << w << endl;

This would result in the following calculations


Hide Copy Code

00000011
11111100

- 0x03
- ~0x03

0000000000000011
1111111111111100

b
- 0x03
- ~0x03

Another ideal use, is to combine it with the & operator to ensure that certain bits are set to zero. Say we want to
clear bit four
Hide Copy Code

BYTE
cout
BYTE
cout

b = 50;
<< "b = " << b << endl;
c = b & ~0x10;
<< "c = " << c << endl;

This would result in the following calculations


Hide Copy Code

00110010
& 11101111
---------00100010

- b
- ~0x10
- result

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

The >> and << operators


The >> (Right shift) and << (left shift) operators move the bits the number of bit positions specified. The >> operator
shifts the bits from the high bit to the low bit. The << operator shifts the bits from the low bit to the high bit. One use
for these operators is to align the bits for whatever reason (check out the MAKEWPARAM, HIWORD, and LOWORD
macros)
Hide Copy Code

BYTE b = 12;
cout << "b = " << b << endl;
BYTE c = b << 2;
cout << "c = " << c << endl;
c = b >> 2;
cout << "c = " << c << endl;

This would result in the following calculations


Hide Copy Code

00001100
00110000
00000011

- b
- b << 2
- b >> 2

Bit Fields
Another interesting thing that can be done using bits is to have bit fields. With bit fields you can set up minature
structures within a BYTE, WORD or DWORD. Say, for example, we want to keep track of dates, but we want to use
the least amount of memory as possible. We could declare our structure this way
Hide Copy Code

struct date_struct {
BYTE day
: 5,
month : 4,
year : 14;
} date;

// 1 to 31
// 1 to 12
// 0 to 9999

In this example, the day field takes up the lowest 5 bits, month the next four, and year the next 14 bits. So we can
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

store the date structure in twenty three bits, which is contained in three BYTEs. The twenty fourth bit is ignored. If I
had declared it using an integer for each field, the structure would have taken up 12 BYTEs.
Hide Copy Code

|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|0 0 0 0 0 0 0 0|
|
|
|
|
+------ year ---------------+ month +-- day --+

Now lets pick this declaration apart to see what we are doing.
First we will look at the data type we are using for the bit field structure. In this case we used a BYTE. A BYTE is 8
bits, and by using it, the compiler will allocate one BYTE for storage. If however, we use more than 8 bits in our
structure, the compiler will allocate another BYTE, as many BYTEs as it takes to hold our structure. If we had used a
WORD or DWORD, the compiler would have allocated a total of 32 bits to hold our structure.
Now lets look at how the various fields are declared. First we have the variable (day, month, and year), followed by
a colon that separates the variable from the number of bits that it contains. Each bit field is separated by a comma,
and the list is ended with a semicolon.
Now we get to the struct declaration. We put the bit fields into a struct like this so that we can use convention
structure accessing notation to get at the structure members. Also, since we can not get the addresses of bit fields,
we can now use the address of the structure.
Hide Copy Code

date.day = 12;
dateptr = &date;
dateptr->year = 1852;

License
This article, along with any associated source code and files, is licensed under The Code Project Open License
(CPOL)

Share
open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

EMAIL

About the Author


PJ Arends
President
Canada
No Biography provided

You may also be interested in...


Bitwise Operation Explained

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

10 Ways to Boost COBOL


Application Development

pdfcrowd.com

Easier bitwise operations

SAPrefs - Netscape-like
Preferences Dialog

Intel Quark SE Microcontroller


C1000 Developer Kit Accelerometer Tutorial

Generate and add keyword


variations using AdWords API

Comments and Discussions


You must Sign In to use this message board.
Search Comments
Spacing Relaxed

Layout Normal

Go
Per page 25

Update

First Prev Next

A handy tool to see bitwise calculations in action

Member 11339123

13-May-15 11:04

ERROR

Atul Khanduri

16-Feb-14 16:27

Nice article....

Atul Khanduri

30-Dec-13 4:14

My vote of 5

Aris79

4-Nov-13 7:30

My vote of 5

fjywade

1-Jun-13 2:21

My vote of 5

Member 9783018

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

5-Feb-13 11:41

pdfcrowd.com

Useful Topic

duccuongpx

My vote of 4

wangxj_nemo

16-May-12 19:14

My vote of 4

yogesh muchhal

23-Nov-11 18:33

My vote of 5

kamiccolo

My vote of 4

VitStepanek

Excellant, Very down to earth and insighful

Member 849910

28-Jul-10 6:05

My vote of 4

thebadboy9999

11-Jul-10 6:12

thank you

Member 3078414

8-May-10 3:00

bitwise with floating point numbers

Roman Tarasov

1-Dec-09 3:33

PJ Arends

4-Dec-09 6:52

Re: bitwise with floating point numbers

22-Jun-12 9:47

1-Jun-11 6:04
1-Aug-10 22:02

useful article

islandscape

14-Oct-09 3:54

is here an error?

langzhengyi

31-May-09 21:53

spacevector

10-Jul-12 22:13

Atul Khanduri

16-Feb-14 16:19

Re: is here an error?


Re: is here an error?
Helpful article

Ravi003

nice thanks

moonbinary

10-Jan-09 19:15

good

AlexanderBX

3-Nov-08 19:58

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

27-Jan-09 0:10

pdfcrowd.com

Nice work! Thank you !

cometdlut

a very clear thought

adamzhang

Last Visit: 31-Dec-99 19:00


General

News

Last Update: 29-Jan-17 19:05


Suggestion

Question

2-Oct-08 22:38
3-Jul-08 3:25

Refresh
Bug

Answer

Joke

Praise

1 2 3 4 5 Next
Rant

Admin

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.
Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.170118.1 | Last Updated 9 May 2002

open in browser PRO version

Layout: fixed |
Select Language fluid

Are you a developer? Try out the HTML to PDF API

Article Copyright 2002 by PJ Arends


Everything else Copyright CodeProject, 1999-2017

pdfcrowd.com

Das könnte Ihnen auch gefallen