考虑无符号整数表示。为了存储一个包含以下数字的十进制数,需要多少位:
i) 3 digits ii) 4 digits iii) 6 digits iv) n digits
我知道无符号整数的范围是0到2^n,但我不明白表示一个数字所需位数如何取决于它。
考虑无符号整数表示。为了存储一个包含以下数字的十进制数,需要多少位:
i) 3 digits ii) 4 digits iii) 6 digits iv) n digits
我知道无符号整数的范围是0到2^n,但我不明白表示一个数字所需位数如何取决于它。
你只需要为每种情况计算范围,然后找到最低的大于该范围的2的幂。
例如,在 i) 中,3个十进制数字 -> 10^3 = 1000 可能的数字,因此您必须找到最低的大于1000的2的幂,这种情况下是2^10 = 1024 (10位)。
编辑: 基本上,您需要找到具有与十进制中相同数量可能性的数字位数(在此情况下为二进制)。
要根据数字位数计算可能性:possibilities=base^ndigits
因此,如果您在十进制(基数10)中有3位数字,则有10^3=1000
个可能性。然后您必须找到二进制(位数,基数2)的数字位数,以使可能性至少为1000,这种情况下是2^10=1024
(9位不足,因为2^9=512
小于1000)。
如果您将其推广,就会得到: 2^nbits=possibilities <=> nbits=log2(possibilities)
应用于i): log2(1000)=9.97
,由于位数必须是整数,因此必须将其向上取整到10。
存储n个整数所需的二进制位数的公式(例如,0到n-1)是:
并向上取整。
例如,对于值-128到127(有符号字节)或0到255(无符号字节),整数的数量为256,因此n为256,从上述公式中得到8。
对于0到n,在上述公式中使用n + 1(共有n + 1个整数)。
在计算器上,loge可能只标记为log或ln(自然对数)。
在基数为 b 的情况下,n 位数能够表示的最大数字是 bn-1。因此,在 N 个二进制位中能够表示的最大数字是 2N-1。我们需要找到满足以下条件的最小整数 N:
2N-1 ≥ bn-1
⇒ 2N ≥ bn
对于上述最后一个式子两边同时取以 2 为底的对数,得到:
log2 2N ≥ log2 bn
⇒ N ≥ log2 bn
⇒ N ≥ log bn / log 2
由于我们想要找到满足上述关系的最小整数 N,因此需要求出 log bn / log 2 并向上取整即可得到 N。
在上述式子中,对数的底数可以是任意值,只要两个底数相同即可。由于我们此处关心的是 b = 10 的情况,因此可以使用以 10 为底的对数,利用 log1010n == n 这个等式。
当 n = 3 时:
N = ⌈3 / log10 2⌉ = 10
当 n = 4 时:
N = ⌈4 / log10 2⌉ = 14
当 n = 6 时:
N = ⌈6 / log10 2⌉ = 20
通常来说,对于n个十进制位数:
N = ⌈n / log10 2⌉
log
有时表示log<sub>e</sub>
或ln
;我尤其注意到这一点在旧的数学参考文献中。 - ad absurdum如何确定表示数字所需的位数的技巧是这样做的。您有R个符号用于表示,并且想知道需要多少位,解决此方程式 R=2^n 或 log2(R)=n。其中n是比特数,R是表示中的符号数。
对于十进制数字系统,R=9,因此我们解决9=2^n,答案是每个十进制数字需要3.17位比特。因此,一个三位数需要9.51位或10位。一个1000位数字需要3170位。
2^n = 999
nlog2 = log999
n ~ 10
int nBits = ceil(log2(N));
这是因为pow(2, nBits)略大于N。
对于一个n位二进制数,它所能表示的最大十进制值为
2^n - 1,而2^n是使用这么多位数字可以生成的总排列数。
以只想要三个数字的情况为例,即您的情况1。我们看到要求是:
2^n - 1 >= 999
对两边应用对数:
log(2^n - 1) >= log(999)
log(2^n) - log(1) >= log(999)
n = 9.964(约)。
由于9.964不能是有效的数字位数,因此取n的ceil值,我们得到n = 10。
将数字不断除以2,直到得到商为0。
最简单的答案是将所需值转换为二进制,并查看该值需要多少位。然而,问题要求X位十进制数需要多少位。在这种情况下,似乎必须选择具有X位的最高值,然后将该数字转换为二进制。
作为一个基本示例,假设我们想存储一个1位十进制数,并想知道需要多少位。最大的1位十进制数是9,因此我们需要将其转换为二进制。这产生了1001,共有4位。这个例子也适用于两位数(最大值为99,转换为1100011)。要解决n位数,您可能需要解决其他问题并寻找模式。
要将值转换为二进制,您需要重复除以2,直到获得商为0(所有余数都为0或1)。然后,您需要颠倒余数的顺序以获取二进制数。
例如:将13转换为二进制。
希望这能帮到你。
这个可以工作!
floor(loge(n) / loge(2)) + 1
为了包含负数,您可以添加一个额外的位来指定符号。
floor(loge(abs(n)) / loge(2)) + 2