Two C bit-operation puzzles.

Light Poster
18Feb2008,17:16   #1
partizan's Avatar
1. Using only bitwise operations: ! ~ & ^ | + << >> and no loops, function calls, or conditional statements count number of bits in a passed integer. Ex, bitCount(5) = 2, bitCount(7) = 3. Maximum operations allowed is 20.

2. Using only bitwise operations: ! ~ & ^ | + << >> and no loops, function calls, or conditional statements find sum of three integers using only on + operator. Ex. sum3(3, 4, 5) = 12. Maximum operations allows is 20.

For both puzzles assume that the size of int is 32bits.

Ambitious contributor
18Feb2008,18:17   #2
imrantechi's Avatar
answer of first puzzle.

int bitCount(unsigned int num)
{
unsigned int n;

n = num - ((num >> 1) & 033333333333) - ((num >> 2) & 011111111111);

return ((n + (n >> 3)) & 030707070707) % 63;
}

You can search on google also.
Ambitious contributor
18Feb2008,18:19   #3
imrantechi's Avatar
2nd puzzle i am not getting!!!

else

num1+ num2 + num3
Light Poster
18Feb2008,18:25   #4
partizan's Avatar
I need time to process first solution

Here is clarification on the second one

static int sum(int x, int y) {
return x+y;
}
int sum3(int x, int y, int z) {
int word1 = 0;
int word2 = 0;
/************************************************** ************
Fill in code below that computes values for word1 and word2
without using any '+' operations
************************************************** *************/

/************************************************** ************
Don't change anything below here
************************************************** *************/
return sum(word1,word2);
Light Poster
18Feb2008,18:29   #5
partizan's Avatar
Quote:
Originally Posted by imrantechi
answer of first puzzle.

int bitCount(unsigned int num)
{
unsigned int n;

n = num - ((num >> 1) & 033333333333) - ((num >> 2) & 011111111111);

return ((n + (n >> 3)) & 030707070707) % 63;
}

You can search on google also.

There are some restrictions:
1. We are not allowed to use unsigned integers
2. You are using '-' (minus) operator (easy to substitute by [~(x) + 1] )
3. % as you may see is not allowed

But thank you for your reply, I will try to see what it does.
Light Poster
18Feb2008,18:30   #6
partizan's Avatar
sorry there was a typo in the puzzle

2. Using only bitwise operations: ! ~ & ^ | + << >> and no loops, function calls, or conditional statements find sum of three integers using only one + operator. Ex. sum3(3, 4, 5) = 12. Maximum operations allows is 20.
Light Poster
18Feb2008,18:34   #7
partizan's Avatar
Quote:
Originally Posted by imrantechi
answer of first puzzle.

int bitCount(unsigned int num)
{
unsigned int n;

n = num - ((num >> 1) & 033333333333) - ((num >> 2) & 011111111111);

return ((n + (n >> 3)) & 030707070707) % 63;
}

You can search on google also.
when you write 033333333333 you mean 0x033.33 right
and 0x111.11 you mean 0001 0001 ... 0001 in binary. Correct?