查找最少位以2s补码存储int

时间:2013-02-03 19:35:51

标签: c bit-manipulation

这是我目前正在处理的作业问题。我们要做的是查看传递的32位int x并返回将该值存储为2s补码所需的最少位。

例如:

howManyBits(0) = 1;
howManyBits(-1) = 1;
howManyBits(7) = 4;
howManyBits(-10) = 5;

问题在于我只能使用按位运算符来查找它,我不能有大于一个字节的常量,并且总共不能超过90次运算。 此刻,我能够从最重要的位向右涂抹一个1,然后我将每1个计数一次。但是,因为它是一个32位的int,并且我每次检查一个位被翻转时我必须将int向右移1,所以对这些位进行计数的过程需要自己进行90次操作,并且因为比特涂抹了20,我完全超过了最大的操作。

另外,我并没有大声在我的解决方案中使用条件或循环。

我知道如果我能找到一个可以解决它的log_2算法,但我还没有能够在按位运算符中找到它。

我想要的只是提示/解释一个过程,它将在更少的操作中完成,而不是实际的代码解决方案。谢谢!

3 个答案:

答案 0 :(得分:1)

您可以在7次操作中找到32位数的log_2。查看优秀的Bit Twiddling Hacks

答案 1 :(得分:0)

休斯顿 - 你有问题。

howManyBits(0) = howManyBits(-1) = 1;

因此,您需要至少2位为零。 (或-1)

答案 2 :(得分:0)

由于这是家庭作业,我不想给你一个直接的答案,但是你正在使用log2的想法。

您可以通过三种操作的组合将其拉出(对于正数)

 1) Shift right 1
 2) Test for 0
 3) Add 1 to a number

希望足以让你到达那里。由于源编号将是二进制补码,因此您需要先将其转换为正数才能使上述有效。