这是我一直困扰的家庭作业问题。
考虑无符号整数表示。多少位 需要存储包含以下内容的十进制数字:
i) 3 digits ii) 4 digits iii) 6 digits iv) n digits
我知道无符号整数的范围是0到2 ^ n,但我不知道表示数字所需的位数如何取决于它。请帮帮我。
提前致谢。
答案 0 :(得分:25)
嗯,你只需计算每个案例的范围,找到高于该范围的2的最低权力。
例如,在i)中,3个十进制数字 - > 10 ^ 3 = 1000个可能的数字,因此您必须找到高于1000的最低2的幂,在这种情况下是2 ^ 10 = 1024(10位)。
编辑:基本上你需要找到你所拥有的位数的可能数字的数量,然后找到哪个数字位数(在另一个基数中,在这种情况下是基数2,二进制)至少与十进制数字相同。
根据位数计算可能性的数量:possibilities=base^ndigits
因此,如果您有十进制的3位数(基数为10),则有10^3=1000
种可能性。然后你必须找到二进制数位(位,基数2),以便可能性的数量至少为1000,在这种情况下是2^10=1024
(9位数是不够的,因为{{1} }小于1000)。
如果您对此进行概括,则可以:2^9=512
适用于i)给出:2^nbits=possibilities <=> nbits=log2(possibilities)
并且因为位数必须是整数,所以你必须将它四舍五入为止。
答案 1 :(得分:6)
存储 n 整数所需的二进制位数的公式(例如, 0 到 n - 1 )是:< / p>
< / p>
并向上舍入。
例如,对于值-128到127(有符号字节)或0到255(无符号字节),整数个数是256,所以 n 是256,从上面的公式得到8
对于 0 到 n ,请在上面的公式中使用 n + 1 ( n + 1 整数)。
在您的计算器上, log e 可能只标有日志或 ln (自然对数)。< / p>
答案 2 :(得分:4)
好的概括说明你需要多少比特来表示一个数字就是这样做的。你有R符号用于表示,你想知道有多少位,求解这个等式R = 2 ^ n或log2(R)= n。其中n是比特数,R是表示符号的数量。
对于十进制数系统R = 9,我们求解9 = 2 ^ n,答案是每个十进制数3.17位。因此,3位数字需要9.51位或10. 1000位数字需要3170位
答案 3 :(得分:2)
基数 b 中 n 位数可以表示的最大数字是 b n - 1 。因此,可以用 N 二进制数字表示的最大数字是 2 N - 1 。我们需要最小的整数 N ,以便:
2 N - 1≥b n - 1
⇒2 N ≥b n
取最后一个表达式两边的基数2对数给出:
log 2 2 N ≥log 2 b n
⇒N≥log 2 b n
⇒N≥logb n / log 2
由于我们希望满足最后一个关系的最小整数 N ,要找到 N ,找到 log b n / log 2 并采取上限。
在最后一个表达式中,只要两个碱基相同,任何碱基都可以用于对数。这里很方便,因为我们对 b = 10 的情况感兴趣,使用基数10对数利用 log 10 10 n < / sup> == n 。
n = 3 :
N =⌈3/ log 10 2⌉= 10
n = 4 :
N =⌈4/ log 10 2⌉= 14
n = 6 :
N =⌈6/ log 10 2⌉= 20
通常,对于 n 十进制数字:
N =⌈n/ log 10 2⌉
答案 4 :(得分:1)
继续将数字除以2,直到得到0的商。
答案 5 :(得分:0)
最简单的答案是将所需的值转换为二进制,并查看该值需要多少位。但是,该问题询问十进制数X位数的位数。在这种情况下,您似乎必须选择X位数的最高值,然后将该数字转换为二进制。
作为一个基本的例子,我们假设我们想要存储1位十进制数,并想知道需要多少位。最大的1位数十进制数是9,所以我们需要将其转换为二进制数。这产生1001,总共有4位。这个相同的例子可以应用于两位数字(最大值为99,转换为1100011)。要求解n个数字,您可能需要解决其他问题并搜索模式。
要将值转换为二进制,重复除以2直到得到0的商(并且所有余数将为0或1)。然后,您可以撤消余数的订单以获取二进制数。
例如:13到二进制。
希望这会有所帮助。
答案 6 :(得分:0)
让它需要n位然后2 ^ n =(base)^ digit然后记录并计算no。为n
答案 7 :(得分:0)
对于n位的二进制数,它可以容纳的最大十进制值为
2 ^ n - 1,并且2 ^ n是使用这些数字可以生成的总排列。
以你只想要三位数的情况为例,即你的情况1.我们看到要求是,
2 ^ n - 1> = 999
将日志应用于双方
log(2 ^ n - 1)&gt; = log(999)
log(2 ^ n) - log(1)&gt; = log(999)
n = 9.964(约)。
从9.964开始取n的ceil值不能是有效的位数,我们得到n = 10.
答案 8 :(得分:0)
假设问题是询问存储
所需的最小位数我对这个问题的处理方法是:
这个问题可以通过递归地将999除以2来解决。但是,使用数学的力量来帮助我们更简单。基本上,我们为下面的等式解决n:
2^n = 999
nlog2 = log999
n ~ 10
您需要10位来存储3位数字。
使用类似方法解决其他子问题!
希望这有帮助!
答案 9 :(得分:0)
这里有很多答案,但是我会在处理同样的问题时发现这篇文章后添加我的方法。
从我们所知道的开始是从0到16的数字。
Number encoded in bits minimum number of bits to encode
0 000000 1
1 000001 1
2 000010 2
3 000011 2
4 000100 3
5 000101 3
6 000110 3
7 000111 3
8 001000 4
9 001001 4
10 001010 4
11 001011 4
12 001100 4
13 001101 4
14 001110 4
15 001111 4
16 010000 5
查看休息时间,它会显示此表
number <= number of bits
1 0
3 2
7 3
15 4
那么,现在我们如何计算模式?
请记住,log base 2(n)= log base 10(n)/ log base 10(2)
number logb10 (n) logb2 (n) ceil[logb2(n)]
1 0 0 0 (special case)
3 0.477 1.58 2
7 0.845 2.807 3
8 0.903 3 3 (special case)
15 1.176 3.91 4
16 1.204 4 4 (special case)
31 1.491 4.95 5
63 1.799 5.98 6
现在匹配第一个表的所需结果。请注意一些值是如何特殊情况。 0和任何2的幂数。当你应用上限时,这些值不会改变,所以你知道你需要加1才能获得 最小位字段长度。
要考虑特殊情况,请在输入中添加一个。在python中实现的结果代码是:
from math import log
from math import ceil
def min_num_bits_to_encode_number(a_number):
a_number=a_number+1 # adjust by 1 for special cases
# log of zero is undefined
if 0==a_number:
return 0
num_bits = int(ceil(log(a_number,2))) # logbase2 is available
return (num_bits)
答案 10 :(得分:0)
这一个有效!
floor(loge(n) / loge(2)) + 1
要包含负数,可以添加额外的一位以指定符号。
floor(loge(abs(n)) / loge(2)) + 2
答案 11 :(得分:0)
简短的答案是:
int nBits = ceil(log2(N));
这仅仅是因为 pow(2,nBits)大于N。