The & Operator

A

Albert

Hello,

I'm having trouble understanding what K&R are saying: 'The bitwise AND
operator & is often used to mark off some set of bits, for example,

n = n % 0177;

sets to zero all but the low-order 7 bits of n.'

So in the end, what actually happens? What does the value of n become?
 
K

Keith Thompson

Albert said:
I'm having trouble understanding what K&R are saying: 'The bitwise AND
operator & is often used to mark off some set of bits, for example,

n = n % 0177;

You mean "n = n & 0177";
sets to zero all but the low-order 7 bits of n.'

So in the end, what actually happens? What does the value of n become?

Think of the value of n as binary. 0177 is an octal constant; in
binary, it's 01111111. Ideally, n should be unsigned (bitwise operators
normally shouldn't be used with signed types).

For single-bit operands, the "&" operator is defined as:
0 & 0 == 0
0 & 1 == 0
1 & 0 == 0
1 & 1 == 1

Suppose the value of n (in binary) is 00010100111001111000101101001100
(32 bits). Then and-ing that value with 0177 yields:

00010100111001111000101101001100
& 00000000000000000000000001111111
--------------------------------
00000000000000000000000001001100

As you can see, this does just what K&R say it does: it zeros all but
the low-order 7 bits of n.
 
M

Markus Becker

Albert said:
And could someone give me an example of when the & operator is useful
or needed?

I guess you mean a real-world example ...

Think of some code-base that uses for example the following definition
for error values to set or return:

// Error-categories
#define CAT_FILEOP 0x0100
#define CAT_WHATEVER 0x0200

#define ERR_NOSUCHFILE (CAT_FILEOP|0x01) // '|' means OR where '&' means AND
#define ERR_FILEEXISTS (CAT_FILEOP|0x02)

// ...

#define ERR_OUTOFMEM (CAT_WHATEVER|0x01)

Then you can use:

void check_error(int _err)
{
int cat,err;

cat = _err&0xf00; // mask out the specific error bits and get the category
err = _err&0x0ff; // mask out the category bits and get the error
hope("this helped"); // ;-)
}

Markus
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,776
Messages
2,569,603
Members
45,189
Latest member
CryptoTaxSoftware

Latest Threads

Top