2016-11-24 87 views
0

我得知,以便确定代表一个数Ñ是通过取n的对数所需的位的数目,即log(n)(基数为2)。但是,我不相信!看看我的例子:知道的比特数来表示数

if if n=4,那么我需要log4 = 2 bits来表示4,但是4是(100)在二进制中显然是3位!

有人可以解释为什么吗? 谢谢。

+0

downvote!有什么不对?提前对不起 – Kris

+1

是的,我可以解释它!你所学到的是错误的*。忘掉它吧。用'k'位可以表示从'0'到'2^k-1'的数字。唉,'2^k'超出这个范围。也许你想知道,你需要确切的'log(n)'位来表示每个自然数*小于'n' *。为了包含'n',你*可能需要另外一点。 –

+0

@ n.m。非常感谢你。现在很清楚。欣赏它 – Kris

回答

1

你确定你不是在谈论n位的安排吗?

随着2位您有4个不同的序列:

00 
01 
10 
11 

数字4是二进制有效100,但我怀疑你混合这些概念。

+0

感谢您的回复。不,我不是在谈论安排,因为我知道我需要n因子。我刚刚从YouTube课程中学到了这一点(为了确定表示数字n所需的位数是取对数),所以我试图说服自己!我想我在这里混合一些东西。谢谢 – Kris

+1

As @ n.m。评论你的问题,_不要试图说服自己,因为这是不对的。就像我说的那样,log(n)将会给你一些比特排列的数量,或者像n.m.提到,表示整数的位数小于'n'。 – Mat

+0

谢谢Mat澄清。 – Kris

1

对于最直接的方案,您采取ceil(log2(N+1))log2表示为浮动。

在纯积分中,一个天真的方案是将数除以2(直到得到零结果)(例如4/2 = 2,2/2 = 1,1/2 = 0 - 三个分区变为零,因此需要3个比特)。

更多advanced schemes exist,但走这条路可能会伤害你的表现 - 现代CPU-es有instructions来检测一个数字的msb设置为1的位置,这些指令需要很少的CPU周期。

+0

实际上它是'ceil(log2(N + 1))',这就是OP错误的地方。 – biziclop

+0

更正,谢谢 –