二进制补码形式所需的最小位数

5
在我的期中考试中,有这样一道题:给定十进制值,表示每个数字所需的最小二进制位数是多少?这些值分别是:-26、-1、10、-15、-4。我完全没有答对这道题,解决方案令人困惑。我唯一真正理解的部分是找到值所在的范围。例如,-15将位于[-2^5,2^5)范围内,-4将位于[-2^2,2^2)范围内。从这里开始需要哪些步骤才能确定所需的位数呢?我尝试找到一些模式来解决问题,但只适用于前两种情况。这是我的尝试:
  1. 首先找到范围。-2^6 < -26 < 2^6
  2. 然后找到2^6 = 32的值。
  3. 然后找到“最接近”边界和该值之间的差异。
-26 - (-32) = 6
同样,这仅适用于前两个值,并且现在我被卡住了,无法找到整数在二进制补码形式下所需的位数与实际整数之间的关系。提前感谢!

从这里开始需要哪些步骤 - 你需要查看指数。 - user529758
1个回答

7
首先,你关于2的幂次方的计算有误。32=25
无论如何,我能理解前两个步骤,但是最后一步不太对。
1. 找到以2为底数的幂次方区间来包含这个数字。所以一个以2为底数的幂次方区间形式为[-2N, 2N - 1]。对于-26,它对应的区间为-25 ≤ -26 ≤ 25 - 1,也就是-32 ≤ -26 ≤ 31。
2. 用补码表示法表示这个数字需要的位数就是N+1。其中“+1”是为了考虑符号位。对于-26,它需要的位数为5+1=6。
因此,对于你列出的每个数字:-26、-1、10、-15和-4:
- 对于-26,-25 ≤ -26 ≤ 25 - 1变成了-32 ≤ -26 ≤ 31,需要 5 + 1 = 6位。 - 对于-1,-20 ≤ -1 ≤ 20 - 1变成了-1 ≤ -1 ≤ 0,需要 0 + 1 = 1位。 - 对于10,-24 ≤ 10 ≤ 24 - 1变成了-16 ≤ 10 ≤ 15,需要 4 + 1 = 5位。 - 对于-15,-24 ≤ -15 ≤ 24 - 1变成了-16 ≤ -15 ≤ 15,需要 4 + 1 = 5位。 - 对于-4,-22 ≤ -4 ≤ 22 - 1变成了-4 ≤ -4 ≤ 3,需要 2 + 1 = 3位。
明白了吗?
其中-1是比较棘手的一个。

同意 - 看起来像是 ceil(log2(abs(_number_)))+1,其中的 +1 是为了添加一个额外的位用于可选符号。 - Jongware
1
@Jongware:小心。该范围在原点周围是不对称的(最负值的幅度比最正值大),但您建议使用“abs”是对称的。 - Joe Z
是的,自从我开始为期末考试学习以来,我的逻辑已经有些偏差了,所以不用担心。但现在它确实有意义了!本质上,任务就是找到包含该值的2^x范围,然后取x+1以找到所需的位数。谢谢! - Andrew T
@JoeZ:啊,你说得对。使用位时,负数部分总是多一个值。没有简洁地表达它的方法 :( - Jongware
哦!我想我只读了最后一句话:“-1很棘手”,并没有意识到它已经在你的解释中 :) 评论已删除。 - mcleod_ideafix
@mcleod_ideafix:别担心。-1确实很棘手。任何在C语言中意外声明了一个1位有符号位域的人已经发现了那个只能保存0或-1的变量。 - Joe Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接