将小数转换为只有两位数字的二进制文件:1和2



我在大学课本上的一个练习有问题。这是:

我们感兴趣的是一个二进制系统,它表示只有两个数字的正整数:1和2(没有零!(。随后的位置对应于二者的连续幂,就像在通常的二进制表示法中一样:在第k个位置,有一个数字的值乘以2^k,k=0,1,2……在这个系统中,由于没有前导零,除了前面提到的数字表示外,我们还使用一个值来指定所选数字的数量,让我们称之为c。因此,每个数字由一对(a,c(表示,其中a是1和2的有限序列,c确定该序列的长度。例如,对(12,3(表示数字4,对(221,3(代表数字13。写一个函数,对于正数x,它确定其值在所讨论的系统中的表示,并将其传递给参数y。让我们同意,如果x不是正数,字段c的值应该是0。

我发现我可以很好地将十进制输入转换为二进制,然后将二进制转换为练习中提到的系统。从右边开始,我需要通过将高位数字1转换为低位数字2来去除零。

例如:小数=21。二进制=10101。系统形成练习=10101->10021;10021->02021->01221

然而,可能还有更有效的解决方案,可以将小数直接转换为练习中的系统。我很感谢你在寻找算法思维路径方面的帮助。然后我会自己编码以确保我理解它

这是我在论坛上的第一篇帖子,英语不是我的母语。如果我表达得不够清楚,我很抱歉。

问候

n是我们试图表示的数字。数量c必须满足

20+21+…+2c−1=2c−1≤n≤2c+1-2=2(20+21+…+2c−1(。

通过检查,这些范围划分自然数,因此唯一的解决方案是c=⌊log2(n+1(⌋。楼层日志通常可以用一条指令计算,也可以使用一个小技巧。

一旦我们知道c,我们只需要找到n−(20+21+…+2c−1(=n-(2c−1(的常用二进制表示,并在每个数字上加一。

最新更新