# What does it mean.

I don't understand this logic.

& = And (Bits)
~ = Not (Bits Too).

Well in a book I have this code.
iWidth = 2 * ((cx * cBitsPixel + 15) & ~15) >> 3;

What does & ~ mean?... I can figure out mixing the And and not operators...

And what does this code line do exactly?...
For example assuming that:
cx = 4, cBitsPixel = 5... What would be the result?.

Thanks.
LVL 1
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
~15 means that the compiler will invert the bit pattern formed by the integer 15.  In hex, 15 is 0x000f (assuming 2-byte integers), so ~15 is 0xfff0.

This value is anded with 2*(cx*cBitsPixel+15).  The net effect is to turn off the last four bits.

So to take your entire example:

2 * ((cx * cBitsPixel + 15) & ~15) >> 3
== 2 * ((4 * 5 + 15) & ~15) >> 3
== 2 * (35 & ~15) >> 3
== 2 * (0x0023 & 0xfff0) >> 3
== 2 * 0x0020 >> 3
== 0x0040 >> 3
== 0x0008

-- Zizzer
0

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Commented:
> I don't understand this logic.
>
> & = And (Bits)
> ~ = Not (Bits Too).

> Well in a book I have this code.
> iWidth = 2 * ((cx * cBitsPixel + 15) & ~15) >> 3;

> What does & ~ mean?...

Let me guess: your book is about some kind of bitmaps, graphical images or something. Let's separate the parts of expression to make some sense of it. I'll try to go step by step, but I'm omitting some trivial explanation going from one form of the expression to another equivalent form.

1) cx         - x coordinate in pixels
2) cBitsPixel - amount of bits per pixel
3) cx * cBitsPixel - amount of bits to represent cx pixels

Ok, but in memory we store a row of bits in computer words. This particular example refers to 16-bit words. So, how many 16-bit words do we need to store cx pixels?

4) (cx * cBitsPixel + 15) / 16

And how many bits could be stored in these words?

4) (cx * cBitsPixel + 15) / 16 * 16
5) (cx * cBitsPixel + 15) >> 4 << 4
6) (cx * cBitsPixel + 15) & 0xfffffff0
7) (cx * cBitsPixel + 15) & (~0xf)
8) (cx * cBitsPixel + 15) & ~15

And how many bytes in these words?

8) ((cx * cBitsPixel + 15) & ~15) / 8
9) ((cx * cBitsPixel + 15) & ~15) >> 3

Now , I donâ€™t know exactly why this amount of bytes has the prior multiplier 2. There could be various reason for this. What does your book says?

> I can figure out mixing the And
> and not operators...

> And what does this code line
> do exactly?...

I would say the code above evaluates the count of bytes necessary to storage graphical image row of cx pixels ( multiplied by 2 )

> For example assuming that:
> cx = 4, cBitsPixel = 5...
> What would be the result?.

2 * (4 * 5 + 15) / 16 * 16 / 8 ==
2 * (35) / 16 * 16 / 8 ==
2 * 2 * 16 / 8 ==
2 * 32 / 8 == 2 * 4  == 8

You could check this with the following code:

int main()
{
int cx = 4, cBitsPixel = 5;
printf("result: %d\n",2 * ((cx * cBitsPixel + 15) & ~15) >> 3);
return 0;
}

the program outputs:

result: 8

Finally, I don't think this is too efficient expression neither from programming nor from educational point of view.
0
Author Commented:
Well...

At first... I'm sorry for the delay... I was busy trying to solve another programming problems... but here I am

I have to accept zizzer's answer... 'cause it is good...
thanks...

abk:

Yes... of course that part of the book talk about bitmaps... The book is (as you can guess) Charles Petzold's "Programming Windows".

Well... I'm having some mathematical problems in my brain :-)

The book says something like this in the page 663:

---------------------------------------
iWidthBytes = 2 * ((cx * cBitsPixel + 15) / 16);

or as a C programer might tend to write it,

iWidth = (cx * cBitsPixels + 15) & ~15) >> 3;
----------------------------------------
The second way to get the iWidth is clear... but in the first way... I can't accomplish the same result.
Can you explain it to me?...

Well... I think I should to post some points for you... But please... explain it :-)

0
###### It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C++

From novice to tech pro — start learning today.