# Confused by expression.

• 04-07-2005
Hulag
Confused by expression.
I just saw this in some code I have to work on:
Code:

chunkLength = (len+3)&~3
I just don't understand what it tries to do. What would be the value chunkLength if len is equal to 10 for example?

PS: Both, chunkLength and len are integers.
• 04-07-2005
itsme86
Let's assume 16-bit integers to make this more terse. It would add 3 to 10 first. 13 decimal is 00000000 00001101 in binary. The ~3 takes 3 in binary and reverses all the bits so it results in 11111111 11111100

Then you AND those together:
00000000 00001101
&
11111111 11111100
=
00000000 00001100

So chunkLength would end up being 12 decimal.
• 04-07-2005
TheColonial
This truly is a diamond piece of code :).. NOT :)

Basically, it's adding the value 3 to the length variable, and then "turning off" the last 2 bits of the number (~ being bitwise NOT).

Examples (using 5 bits.. on the machine it's probably 32):

3 (decimal) = 00011 (binary)
~3 = 11100 (binary)

if len = 8 (decimal) = 01000 (binary)
len + 3 = 11 (decimal) = 01011 (binary)
(len+3)&~3 = 01000 (binary) = 8 (decimal)

if len = 9 (decimal) = 01001 (binary)
len + 3 = 12 (decimal) = 01100 (binary)
(len+3)&~3 = 01100 (binary) = 12 (decimal)

if len = 10 (decimal) = 01010 (binary)
len + 3 = 13 (decimal) = 01101 (binary)
(len+3)&~3 = 01100 (binary) = 12 (decimal)

if len = 11 (decimal) = 01011 (binary)
len + 3 = 14 (decimal) = 01110 (binary)
(len+3)&~3 = 01100 (binary) = 12 (decimal)

if len = 12 (decimal) = 01100 (binary)
len + 3 = 15 (decimal) = 01111 (binary)
(len+3)&~3 = 01100 (binary) = 12 (decimal)

if len = 13 (decimal) = 01101 (binary)
len + 3 = 16 (decimal) = 10000 (binary)
(len+3)&~3 = 10000 (binary) = 16 (decimal)

Basically, it looks like it's trying to find the minimum size required to contain a given value or something similar, given a chunk size of 4?!

Don't know if that'll help, but hey, it might clear something up :)

Good luck!

[Edit: d*mn, ya beat me to it ;)]
• 04-07-2005
Hulag
Thanks a lot to both of you, it was a great help. I think the reason for this kind of code (there is more code with similar "wierd" operations) is that it works in a little endian kind of way, that's my guess. Anyway, all that code is legacy code.