二进制2的补码

时间:2019-02-25 03:50:01

标签: math binary

我遇到了问题。当我们想使用2的补码从另一个数中减去一个数字时,我们可以这样做。我不知道如何使用2的补码减去小数。

df.withColumn( 'new_col', F.expr("substring(col_A,0,length(col_B))") )

因此,如果现在加5的二进制数,我们可以获得减法结果。如果我想得到5.5-2.125的结果。程序是什么。

1 个答案:

答案 0 :(得分:1)

可以使用固定点号,在嵌入式代码或硬件中找到它们仍然很常见。

它们的用法与整数相同,但是您需要指定“点”的位置。例如,假设您要在该点之后3位,并且您的数据是8位,则7..3位是整数部分(“点”的左侧),而2..0位是小数部分。整数部分的解释通常是该整数的二进制分解:位3对应于2 0 ,位4到2 1 ,等等。

对于小数部分,分解为负幂或两个。位2对应于2 -1 ,位1至2 -2 和位0至2 -3

对于您来说,问题5.5 = 4 + 1 + 1/2 = 2 2 +2 0 +2 -1 及其代码是00101(。)100。同样,2.125 = 2 + 1/8,其代码为00010(。)001(注意(。)只是帮助您理解编码)。

实际上,它们只是整数,但您必须考虑所有数字都乘以2 -3 。这对加法没有影响,但是必须调整乘法和除法的结果。考虑到点的位置以及管理上溢和下溢是使用定点进行算术的困难,但是即使您的硬件不提供浮点支持(例如,使用低端微控制器或FPGA系统),也可以进行分数计算。

两个补码类似于整数,并且其计算相同。如果2.125的代码是00010(。)001,则-2.125 == 11101(。)111。操作照常。

+5     00101(.)100
-2.125 11101(.)111
       00011(.)011

和00011(。)011 = 2 + 1 + 1/4 + 1/8 = 3,375

为记录起见,两个补码首次用于定点小数,并且由此产生两个补码名称。如果小数表示为0(。)1100000(0.75),则其负计数器部分将为1(。)0100000(-0.75或1.25(如果解释为无符号),则我们总是x +(unsigned)-x = 2。对于此编码,分数x的负值是必须加到x以获得2的数字y,因此y是2的x的补数。