Two C bit-operation puzzles.

partizan's Avatar, Join Date: Feb 2008
Light Poster
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.

0
imrantechi's Avatar, Join Date: Feb 2008
Ambitious contributor
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.
0
imrantechi's Avatar, Join Date: Feb 2008
Ambitious contributor
2nd puzzle i am not getting!!!

else

num1+ num2 + num3
0
partizan's Avatar, Join Date: Feb 2008
Light Poster
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);
0
partizan's Avatar, Join Date: Feb 2008
Light Poster
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.
0
partizan's Avatar, Join Date: Feb 2008
Light Poster
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.
0
partizan's Avatar, Join Date: Feb 2008
Light Poster
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?