Question: Hi guys would you mind explaining to me this code? Especially the code where the mask part. In my ubderstanding, the mask is supposed to

Hi guys would you mind explaining to me this code? Especially the code where the mask part. In my ubderstanding, the mask is supposed to represent 1,2,4,8, and 16. But then why is that it's 0x2 for 1 bit? Or am i missing the point. Please explain in detail or perhaps with example.

/* howManyBits - return the minimum number of bits required to represent x in

* two's complement

* Examples: howManyBits(12) = 5

* howManyBits(298) = 10

* howManyBits(-5) = 4

* howManyBits(0) = 1

* howManyBits(-1) = 1

* howManyBits(0x80000000) = 32

* Legal ops: ! ~ & ^ | + << >>

* Max ops: 90

* Rating: 4

*/

int howManyBits(int x) {

int y, result, mask16, mask8, mask4, mask2, mask1, bitnum;

/*

* The idea here is to apply binary search in order to get log number of operations

*/

mask1 = 0x2; // 0x1 << 1

mask2 = 0xC; // 0x3 << 2

mask4 = 0xF0; // 0x000000F0

mask8 = 0xFF<<8; // 0x0000FF00

mask16 = (mask8 | 0xFF) << 16;// 0xFFFF0000

result = 1;

y = x^(x>>31); //cast the number to positive with the same howManyBits result

// Check first 16 bits, if they have at least one bit - result > 16

bitnum = (!!(y & mask16)) << 4; // 16 OR zero

result += bitnum;

y = y >> bitnum;

bitnum = (!!(y & mask8)) << 3; // 8 OR zero

result += bitnum;

y = y >> bitnum;

bitnum = (!!(y & mask4)) << 2; // 4 OR zero

result += bitnum;

y = y >> bitnum;

bitnum = (!!(y & mask2)) << 1; // 2 OR zero

result += bitnum;

y = y >> bitnum;

bitnum = !!(y & mask1); // 1 OR zero

result += bitnum;

y = y >> bitnum;

return result + (y&1);

}

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!