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

Posted

技术标签:

【中文标题】将小数转换为只有两位数的二进制:1 和 2【英文标题】:Converting decimals into binaries of only two digits: 1 and 2 【发布时间】:2021-01-12 14:56:57 【问题描述】:

我的大学书上的练习有问题。这里是:

我们对表示只有两个数字的正整数的二进制系统感兴趣: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 来删除零。

E.g.: Decimal = 21. Binary = 10101. the system form the exercise = 10101 -> 10021 ; 10021 -> 02021 -> 01221

但是,可能有更有效的解决方案可以将练习中的十进制直接转换为系统。感谢您在寻找算法思维路径方面的帮助。然后我会自己编写代码以确保我理解它。

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

亲切的问候

【问题讨论】:

【参考方案1】:

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

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

通过检查,这些范围划分了自然数,所以唯一解是 c = ⌊log2 (n+1)⌋ .楼层日志通常可以用一条指令计算,或者您可以使用bit-twiddling hack。

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

【讨论】:

非常感谢。我认为这是一个很好的解决方案。我只是不明白一点。 “通过检查,这些范围划分了自然数,因此唯一解是 c = ⌊log2 (n+1)⌋。”你能再解释一下吗?我的意思是 - 你怎么知道 c = ⌊log2 (n+1)⌋? @thefool 如果我们在两边都加一个,我们得到 2^c ≤ n ≤ 2^(c+1) - 1,或者 2^c ≤ n

以上是关于将小数转换为只有两位数的二进制:1 和 2的主要内容,如果未能解决你的问题,请参考以下文章

进制之间的转换

进制转换规则

二进制相关算法

C语言:怎么将十进制数字转换为二进制字符串,谁能帮我写个函数

八十十六的数制的转换

二进制小数和IEEE浮点标准