我必须编写一个函数来计算以2的补码形式表示int所需的位数。要求:
1. can only use: ! ~ & ^ | + << >>
2. no loops and conditional statement
3. at most, 90 operators are used
目前,我在想这样的事情:
int howManyBits(int x) {
int mostdigit1 = !!(0x80000000 & x);
int mostdigit2 = mostdigit1 | !!(0x40000000 & x);
int mostdigit3 = mostdigit2 | !!(0x20000000 & x);
//and so one until it reach the least significant digit
return mostdigit1+mostdigit2+...+mostdigit32+1;
}
然而,这个算法并不起作用。它也超过了90个运营商的限制。任何建议,我该如何修复和改进这个算法?
答案 0 :(得分:1)
使用2的补码整数,问题是负数。最高位表示负数:如果设置,则数字为负数。 2的补码整数n的负数定义为 - (1的n的补数)+1 因此,我首先测试负号。如果设置,则所需的位数仅仅是可用于表示整数的位数,例如, 32位。如果没有,您可以简单地计算n向右移位n所需的位数,直到结果为零。如果n,例如,将是+1,例如, 000 ... 001,你必须向右移动一次以使结果为零,例如1次。因此,您需要1位来表示它。