找到最少的位以将INT存储在2S中互补中

问题描述 投票:0回答:2
这是我目前正在努力的家庭作业问题。我们要做的就是查看通过的32位INT X,然后返回将该值存储在2s补充中所需的最少的位。

例如:

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

问题出来的是,我只能使用比特操作员来找到这一点,我的常数不能大于字节,而且我总共不能超过90个操作。
在那一刻,我能够从最重要的一点点涂抹1个,然后我计数其中的每一个。但是,由于它是一个32位的INT,并且每次我检查一下时,我都必须将INT超过1个转移到右边位涂抹花了20,我超过了最大的操作。
,也不允许我在解决方案中使用条件或环。

我知道,如果我能找出可以解决它的log_2算法,但是我也无法仅在比特运算符中弄清楚这一点。 我想要的所有这些都暗示/解释一个过程,该过程可以在更少的操作中进行,而不是实际的代码解决方案。谢谢!

您可以在7个操作中找到32位编号的log_2。看到出色的the twiddlinghacks

-huston-你有问题。

I.E.
c bit-manipulation
2个回答
1
投票
howManyBits(0) = howManyBits(-1) = 1;

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


0
投票
由于这是家庭作业,我不想给您一个直接的答案,但是您的log2 Idea构想正确。

您可以通过三个操作组合将其删除(对于正数)

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

希望您能把您带到那里。 由于源编号将在两个补充中,因此您需要将其转换为正数,以使上述有效。
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.