这是我目前正在处理的作业问题。我们要做的是查看传递的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算法,但我还没有能够在按位运算符中找到它。
我想要的只是提示/解释一个过程,它将在更少的操作中完成,而不是实际的代码解决方案。谢谢!
答案 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
希望足以让你到达那里。由于源编号将是二进制补码,因此您需要先将其转换为正数才能使上述有效。