精华内容
下载资源
问答
  • 十进制数转化为二进制数的两种方法

    万次阅读 多人点赞 2020-12-29 21:14:52
    如果我们要把十进制的150转化为二进制数,可以使用下面两种方法: 第一种方法:表格法 这种方法的核心思想就是用二进制的各位来“拼凑”出我们的十进制数。 我们先把二进制各位的位权列在表格里面。(我们如何...

    如果我们要把十进制的150转化为二进制数,可以使用下面两种方法:

    第一种方法:表格法

    这种方法的核心思想就是用二进制的各位来“拼凑”出我们的十进制数。

    我们先把二进制各位的位权列在表格里面。(我们如何知道要列多少位出来呢?其实我们就是要列到比150小并且最接近150的那一位,也就是列到128就可以了。)

    1286432168421
            

     

     

     

     然后我们从左往右看,如果需要使用这一位去拼凑150这个数,就在那一位的下方写上1,反之,写0.

    128是最接近150的,必然要用到。所以表格变成了下面的样子: 

    1286432168421
    1       

     

     

     

    然后,我们从150里面把128减掉,剩下的是22。我们发现64和32都比22大,那么这两位就用不到,记上0.

    1286432168421
    100     

     

     

     

    16比22小,需要使用,记上1.

    1286432168421
    1001    

     

     

     

    把16从22里减掉,得到6。8比6大,用不到,记上0.

    1286432168421
    10010   

     

     

     

    4比6小,需要使用,记上1.

    1286432168421
    100101  

     

     

     

    把4从6里减掉,得到2. 正好下一位的2可以使用,记为1。至此,就完成了拼凑,所以最后的1也用不上了,记为0.

    1286432168421
    10010110

     

     

     

    表格第二行连起来是10010110,它就是十进制的150在二进制中的表示。

    这种方法的优点是比较容易理解,缺点是有些麻烦。如果数字很大,表格需要列得很长。

    第二种方法:除基取余法

    第一步,150除以2,商75,余0;

    第二步,75除以2,商37,余1;

    第三步,37除以2,商18,余1;

    第四步,18除以2,商9,余0;

    第五步,9除以2,商4,余1;

    第六步,4除以2,商2,余0;

    第七步,2除以2,商1,余0;

    第8步,1除以2,商0,余1.

    组合的时候,一定要记得最后得到的余数是二进制中的最高位。所以我们要倒着组合,得到10010110.

    可能这种方法一开始不是那么好理解,可以对比我们熟悉的十进制数。如果我们有一个十进制数168,第一次除以10,商16,余8,这就相当于我们把个位的8(最低位)给“脱”下来了;第二次,16除以10,商1,余6,这就相当于把十位的那个6给“脱”下来了;然后再用1除以10,商0,余1,这就相当于把百位的1给“脱”下来了。所以我们这一路得到的余数,是从低位到高位的数字。那么二进制里,也是同样的道理。

    使用这种方法,还是比较便捷的,只要计算的时候细心一些就好了。

     

    如果这篇博文帮到了你,就请给我点个吧(#^.^#)

    有疑问也欢迎留言~博主可nice啦,在线秒回ヾ(◍°∇°◍)ノ゙

     

    展开全文
  • bcd码二进制十进制Prerequisite: Number systems 先决条件: 数字系统 BCD Code (8421 Code): In BCD 8421 code, each decimal digit is represented using a 4-bit binary number. The 4-bit binary numbers ...

    bcd码二进制转十进制

    Prerequisite: Number systems

    先决条件: 数字系统

    BCD Code (8421 Code): In BCD 8421 code, each decimal digit is represented using a 4-bit binary number. The 4-bit binary numbers have their weights attached as 8, 4, 2, 1 from MSB to LSB side. Since the weights are attached to it comes in the category of weighted codes and is also sequential.

    BCD代码(8421代码) :在BCD 8421代码中 ,每个十进制数字均使用4位二进制数表示。 从MSB到LSB,4位二进制数的权重分别为8、4、2、1。 由于权重是附加的,因此它属于加权代码类别,并且是顺序的

    In a digital system that accepts only binary numbers in form of 0 and 1, the only way to interpret decimal numbers is its conversion from decimal to binary and vice-versa which is a slow process and it also requires a huge electronic circuitry. So, we use BCD numbers. Also, the sequential nature of BCD numbers makes it advantageous for performing arithmetic operations.

    在仅接受0和1形式的二进制数字的数字系统中,解释十进制数字的唯一方法是将其从十进制转换为二进制,反之亦然,这是一个缓慢的过程,并且还需要庞大的电子电路。 因此,我们使用BCD号码。 而且,BCD编号的顺序性质使其在执行算术运算时具有优势。

    Although, there are many advantages there are some disadvantages too such as:

    尽管有很多优点,但也有一些缺点,例如:

    BCD codes are more inefficient than usual binary codes. Usually, in binary numbers, we represent (13)10 = (1101)2 i.e., we require 4-bits but in BCD notation (13)10 is represented as (0001 0011). Here, we require 8-bits to represent the same 13.

    BCD代码比普通的二进制代码效率低。 通常,在二进制数中,我们表示(13) 10 =(1101) 2,即,我们需要4位,但在BCD表示法中, (13) 10表示为(0001 0011) 。 在这里,我们需要8位来表示相同的13

    Another disadvantage is that arithmetic operations become more complex as compared to the usual binary numbers because, in BCD numbers, we have 6 illegal states as 1010, 1011, 1100, 1101, 1110 and 1111 which are not part of 8421 BCD system.

    另一个缺点是,与通常的二进制数相比,算术运算变得更加复杂,因为在BCD数中,我们有6个非法状态,例如1010、1011、1100、1101、1110和1111 ,它们不是8421 BCD系统的一部分。

    The following table describes the relation between Decimal, Binary and 8421 BCD numbers.

    下表描述了十进制,二进制和8421 BCD编号之间的关系。

    Decimal NumbersBinary Numbers8421 BCD Numbers
    000000000
    100010001
    200100010
    300110011
    401000100
    501010101
    601100110
    701110111
    810001000
    910011001
    1010100001 0000
    1110110001 0001
    1211000001 0010
    1311010001 0011
    1411100001 0100
    1511110001 0101
    .........
    .........
    .........
    小数 二进制数 8421 BCD编号
    0 0000 0000
    1个 0001 0001
    2 0010 0010
    3 0011 0011
    4 0100 0100
    5 0101 0101
    6 0110 0110
    7 0111 0111
    8 1000 1000
    9 1001 1001
    10 1010 0001 0000
    11 1011 0001 0001
    12 1100 0001 0010
    13 1101 0001 0011
    14 1110 0001 0100
    15 1111 0001 0101
    ... ... ...
    ... ... ...
    ... ... ...

    Example 1: Represent (28)10 and (53)10 in 8421 BCD notation

    示例1:以8421 BCD表示法表示(28) 10和(53) 10

    Solution:

    解:

    (28)10 in BCD notation can be represented as (0010 1000).

    (28) BCD表示法中的10可以表示为(0010 1000)

    Similarly, (53)10 in BCD notation can be represented as (0101 0011).

    类似地,BCD表示法中的(53) 10可以表示为(0101 0011)

    BCD加法 (BCD Addition)

    The addition of BCD numbers is slightly different from binary addition. Here, the rules of binary addition are partially applicable only to the individual 4-bit groups. The BCD addition, is thus carried out by individually adding the corresponding 4-bit groups starting from the LSB side and if there is a carry to the next group, or if the result belongs to any of the 6 illegal states than we add 610(0110) to the sum term of that group and resulting carry is added in the next group.

    BCD编号加法二进制加法略有不同。 在此,二进制加法规则仅部分适用于各个4位组。 因此, BCD加法是通过从LSB端开始逐个添加对应的4位组来进行的,如果下一个组有进位,或者结果属于6个非法状态中的任何一个,则我们加6 10 (0110)至该组的总和,并在下一组中添加产生的进位。

    Example: Perform BCD Addition of 6 and 7.

    示例:执行6和7的BCD加法。

    Solution: BCD representation of 6 is given as 0110 and for 7 it is 0111.

    溶液:6 BCD表示被给定为011070111。

    BCD Addition | Example 1

    When we add 6 and 7 in BCD, we get 1101 which is an invalid state therefore, we add 0110 (6) to the sum to get correct result which is 0001 0011 (13).

    当在BCD中将67相加时,我们得到1101 ,这是一个无效状态,因此,我们将0110(6)添加到总和中以获得正确的结果0001 0011(13)

    Example 2: Perform BCD Addition of 8765 and 3943.

    示例2:执行8765和3943的BCD加法。

    Solution:

    解:

    BCD representation of 8765 is given as 1000 0111 0110 0011 and for 3943 it is 0011 1001 0100 0011.

    BCD表示的87651000 0111 0110 0011,39430011 1001 0100 0011

    BCD Addition | Example 2

    Firstly, we will perform a normal binary addition of two numbers now we see 1100 and 1010 which are illegal states also the third group of 4-bits from LSB side i.e., 0000 has a carry 1 to the next group. So, for correction, we have to add 0110 to all three groups. Thus, we get the correct result as 0001 0010 0111 0000 1000 which is equivalent to (12708)10 in decimal number system and this is what we get on adding (8765)10 + (3943)10 = (12708)10. Hence, our result is also verified.

    首先,我们将对两个数字进行正常的二进制加法运算,现在我们看到11001010是非法状态,也是从LSB侧开始的第三组4位,即0000的进位为1 。 因此,为了更正,我们必须在所有三个组中添加0110 。 因此,我们得到正确的结果为0001 0010 0111 0000 1000 ,它等于十进制数系统中的(12708) 10 ,这就是我们加上(8765) 10 +(3943) 10 =(12708) 10的结果 。 因此,我们的结果也得到了验证。

    翻译自: https://www.includehelp.com/basics/binary-coded-decimal-bcd-code-and-its-addition.aspx

    bcd码二进制转十进制

    展开全文
  • 二进制和量化编码

    2021-04-18 00:11:20
    小数 10 进制转二进制: 如 0.8, 转为 2 进制要: 0.8×2=1.6→10.6×2=1.2→10.2×2=0.4→00.4×2=0.8→00.8×2=1.6→1⋮×2=⋮→⋮ \begin{aligned} 0.8 \times 2=1.6\to1 \\ 0.6\times2=1.2\to1\\ 0.2\times2=0.4...

    小数 10 进制转二进制:

    如 0.8, 转为 2 进制要:

    0.8 × 2 = 1.6 → 1 0.6 × 2 = 1.2 → 1 0.2 × 2 = 0.4 → 0 0.4 × 2 = 0.8 → 0 0.8 × 2 = 1.6 → 1 ⋮ × 2 = ⋮ → ⋮ \begin{aligned} 0.8 \times 2=1.6\to1 \\ 0.6\times2=1.2\to1\\ 0.2\times2=0.4\to0\\ 0.4\times2=0.8\to0\\ 0.8\times 2=1.6\to1\\ \vdots\times 2=\vdots\to\vdots \end{aligned} 0.8×2=1.610.6×2=1.210.2×2=0.400.4×2=0.800.8×2=1.61×2=

    所以 0.8 的最终结果就是 0.110011001100…
    在这里插入图片描述

    步骤就是:
    一直乘以 2,将 1 提取出来,然后用小数再乘以 2,直到出现 1 时停止。 像 0.8 这种,得不到 1 的,就只能无限循环。

    浮点数二进制表示

    要表示浮点数,首先应该将其转化为二进制:
    十进制转二进制实例为了用计算机去表示上述的二进制浮点数,还需要将数表示成: a , a ∈ [ ( 1 ) 2 , ( 10 ) 2 ) a,a\in[(1)_2,(10)_2) a,a[(1)2,(10)2) 与 2 的 n n n 次幂相乘的形式,同时将 n n n 转为二进制:

    在这里插入图片描述然后,根据下面的格式,将结果“填下”,以 9 位为例:

    ⏟ 整体符号 ⏟ |幂符号| ⏟ 幂 ⏟ 数 \underbrace{\boxed{}}_{\text{整体符号}}\underbrace{\boxed{}}_{\text{|幂符号|}} \underbrace{\boxed{}\boxed{}\boxed{}}_{\text{幂}} \underbrace{\boxed{}\boxed{}\boxed{}\boxed{}}_{\text{数}} 整体符号 |幂符号|
    其中:

    整体符号:
    表示数的整体符号,如 9.6 是正数,故该位置填 0。反之,若是负数,则填 1。
    幂符号:
    若幂是正数,填 0,负数填 1。本例幂为 3,故填 0。
    幂:
    从低到高开始填,不够补 0。如本例幂为 3,二进制为 11,只有两位,故填上 011。
    数:
    从高位开始填,超出截断。但要注意的是,不需要填第一位,因为第一位总是 1。亦上例为例,数为 1.0011001…,其中最前面的 1 不需要管,因为不管数是多少,我们都要表示成 1。所需,需要填的是 0011。

    在这里插入图片描述

    二进制用于量化编码

    量化:
    将连续数值,转换为某个最小单位的整数倍
    编码:
    将量化结果用代码的形式(可以是二进制)表示出来

    我们似乎已经能够将任何 10 进制,包括浮点数,且一个最好的优点是:理论上,误差为 0 。

    但缺点也很明显:

    范围有限
    表达的范围与二进制位数有关。位数决定了表达范围。并且,不能够将所有的 10 进制,都转换为位数一定的二进制,且有些数可能有舍入误差。
    很可能超出所需表达的范围
    假如我们只需要对 [ 0 , 1 ] [0,1] [0,1] 进行编码,那么上述方法极大可能会超范围。不过这能够通过映射来解决:设 x ′ x^\prime x 为二进制对应的十进制, x m a x ′ x^\prime_{max} xmax 为二进制所能表达的最大数, X X X 是我们所需的范围,于是映射就可以为:
    x = X ⋅ x ′ x m a x ′ x=\frac{X\cdot x^\prime}{x^\prime_{max}} x=xmaxXx

    无法实现量化
    :第一: 因为误差来源于10进制转2进制时的舍入误差误差,所以对有些数误差为 0,另一些可能误差很大。
    第二: 将十进制直接转为二进制,并没有将数值表示为最小单位的整数倍。 所以,不能量化。

    基于上述原因,10进制转2进制,非量化而今用于编码。且这个编码可能无法涵盖我们所需要的范围,另一方面,我们无法估计出最大的编码误差。

    量化

    在一些数模转换中,量化是很重要的,下面以表达 [ 0 , 1 ] [0,1] [0,1] ,长度为 8 的二进制量化为例,希望能给大家一些启发:

    对于 8 位二进制,我们可以表示为整数 0 , 1 , 2 , ⋯   , 7 0,1,2,\cdots,7 0,1,2,,7。于是,若可以想办法把 [ 0 , 1 ] [0,1] [0,1] 按如下方式拆分,并用最小单位 Δ \Delta Δ 去代替,则可以完成我们的量化和编码:

    在这里插入图片描述

    其中 Δ \Delta Δ 是一个人工标定的量化单位。我们把落在 [ 0 , 1 / 15 ) [0,1/15) [0,1/15) 的数都视为 0 / 15 0/15 0/15,把 [ 1 / 15 , 3 / 15 ] [1/15, 3/15] [1/15,3/15] 的数都视为 2 / 15 2/15 2/15,由此可知量化最大误差为 1 / 2 Δ 1/2\Delta 1/2Δ

    对于一般情况下:[0,1] 的量化公式如下:

    设二进制表达转换为 10 进制整数为 N d e c N_{dec} Ndec,用 n n n 表示二进制的位数, N q u a n N_{quan} Nquan反量化后数值, N N N 为量化前的数值,则量化公式为:
    N q u a n = 2 N d e c 2 n + 1 − 1         N ∈ [ 2 N d e c − 1 2 n + 1 − 1 , 2 N d e c + 1 2 n + 1 − 1 ) N_{quan}=\frac{2N_{dec}}{2^{n+1}-1}~~~~~~~N\in[\frac{2N_{dec}-1}{2^{n+1}-1},\frac{2N_{dec}+1}{2^{n+1}-1}) Nquan=2n+112Ndec       N[2n+112Ndec1,2n+112Ndec+1)

    误差大小为:
    N − N q u a n N-N_{quan} NNquan

    展开全文
  • 二进制编码的十进制

    千次阅读 2020-08-25 14:32:35
    两种方法(整数编码的十进制和任意浮点数)都导​​致了此处介绍的二进制编码的十进制类的最终设计。 它分别存储指数尾数。 但是,尾数存储为一组整数。 在当前配置中,使用8个小数位的5个整数。 因此允许40个位置...

    介绍 (Introduction)

    Computers calculate numbers in binary. We forget about this many times as the illusion of a mathematical machine is quite compelling. It’s far easier to forget about binary rounding errors and pretend that calculations are precise.

    计算机以二进制形式计算数字。 我们忘记了很多次,因为数学机器的错觉非常引人注目。 忘记二进制舍入错误并假装计算是精确的,要容易得多。

    Alas! This doesn’t add up for dull purposes like accounting and bookkeeping. Here, a roundoff error of 1 cent can sent an accountant screaming for an explanation and a multi-million dollar investigation. And it is for accounting reasons that databases have special datatypes like NUMERIC and DECIMAL that are precise number formats. This is in contrast with approximate data types like FLOAT and REAL.

    唉! 这不会增加诸如会计和簿记等乏味的目的。 在这里,四舍五入的误差为1美分,可能会导致会计师大声疾呼,要求解释和进行数百万美元的调查。 出于会计原因,数据库具有特殊的数据类型,例如NUMERICDECIMAL ,它们是精确的数字格式。 这与诸如FLOATREAL近似数据类型形成对比。

    In the C++ language, the built-in datatype “double” (IEEE 754) datatype is in radix 2, so it is also an approximate datatype. Although the Intel x386 processor has something of a ‘bcd’ type of operator to correct the effect of binary calculations, no C++ compiler today exists with a built-in exact numeric datatype. (Borland C++ 2.0 being the last one that had that!)

    在C ++语言中,内置数据类型“ double ”(IEEE 754)数据类型位于基数2中,因此它也是一种近似datatype 。 尽管Intel x386处理器具有某种“ bcd ”类型的运算符来纠正二进制计算的影响,但如今不存在具有内置精确数值数据类型的C ++编译器。 (Borland C ++ 2.0是具有该功能的最后一个!)

    The solution has been to store these numbers in the so-called “BINARY-CODED-DECIMAL” format. BCD for short. In such an implementation, no rounding errors can occur, as extra bits are used to represent a decimal number instead of a binary number.

    解决方案是将这些数字以所谓的“ BINARY-CODED-DECIMAL”格式存储。 BCD的简称。 在这样的实现中,不会发生舍入错误,因为多余的位用于表示十进制数而不是二进制数。

    This lack of a binary-coded-decimal datatype makes it cumbersome to do accounting and book­keeping calculations in C++. Also, the storing and retrieving of NUMERIC and DECIMAL numbers to and from databases require lengthy calculations to convert the numbers, requiring precious CPU cycles.

    由于缺少二进制编码的十进制datatype ,因此在C ++中进行记帐和簿记计算很麻烦。 同样,在数据库中存储和检索NUMERICDECIMAL编号也需要很长的计算时间才能转换为数字,这需要宝贵的CPU周期。

    ODBC案例 (The ODBC Case)

    The ODBC (Open-DataBase Connectivity) standard has a data structure (SQL_NUMERIC_STRUCT) to transport the data for NUMERIC and DECIMAL numbers. Data for these datatypes is often binded and used in ODBC applications as a string. The binary transport of that data in a radix 256 numeric struct is often too great a challenge for most programmers on a daily business schedule.

    ODBC(开放数据库连接)标准具有一个数据结构( SQL_NUMERIC_STRUCT ),用于传输NUMERICDECIMAL编号的数据。 这些datatype通常被绑定并在ODBC应用程序中用作string 。 以基数256的数字struct对数据进行二进制传输对于大多数程序员而言,在日常业务计划中通常是一个很大的挑战。

    The chapter about “BCD and the ODBC Standard” explains how this bcd class solves that problem.

    关于“ BCD和ODBC标准 ”的章节解释了该bcd类如何解决该问题。

    BCD的前身 (Predecessors of BCD)

    There have existed (and still exist!) a number of predecessors to this bcd class.

    这个bcd类已经存在(并且仍然存在!)许多前辈。

    4GL编程语言 (4GL Programming Languages)

    Fourth generation languages bonded to a specific database platform (e.g., INFORMIX-4GL) had a DECIMAL datatype as a built-in feature. Binary coded decimal calculations were the default on this platform which made it typically suited to build accounting software and store the results in a database.

    绑定到特定数据库平台的第四代语言(例如INFORMIX-4GL )具有DECIMAL数据类型作为内置功能。 二进制编码的十进制计算是该平台上的默认设置,这使其通常适合于构建会计软件并将结果存储在数据库中。

    Borland C ++编译器 (The Borland C++ Compiler)

    Upto the point where Borland sold their C++ compiler to Embarcadero, it had a built in ‘bcddatatype that could be directly used, just as you would use an ‘int’ or a ‘double’. To my best knowledge, this data­type was dropped in the later versions of this compiler.

    直到Borland将其C ++编译器出售给Embarcadero为止,它都有一个内置的' bcd ' datatype可以直接使用,就像您使用' int '或' double '一样。 据我所知,此datatype已在此编译器的更高版本中删除。

    Microsoft has never bundled a ‘bcddatatype with their implementation of the C++ language. And the language itself, not even through the process of the ISO standard, has ever featured such a datatype. So Borland was unique in this respect.

    Microsoft从未将' bcd ' datatype与C ++语言的实现捆绑在一起。 语言本身甚至没有经过ISO标准的处理,就具有这种datatype 。 因此,Borland在这方面是独一无二的。

    整数编码的十进制 (Integer-coded-decimal)

    In order to do exact numerical calculations, my first try was to implement a numeric class that stores the numbers in integer format. 4 integers before the decimal point and 4 integers after the decimal point. This implementation – dubbed the integer-coded-decimal – did allow for 16 decimal places before and after the decimal point. Enough to do the bookkeeping of a large multi-national company or a small country. 😊

    为了进行精确的数值计算,我的第一个尝试是实现一个数值类,以整数形式存储数字。 小数点前的4个整数,小数点后的4个整数。 此实现称为“整数编码的十进制”,确实允许在小数点之前和之后保留16个小数位。 足以完成大型跨国公司或小国的簿记工作。 😊

    Although the classical operators like adding and subtracting are easy to implement in this format, much was left to be desired. As soon as we want to implement more mathematical operators, this implementation becomes bothersome, and as we will see later: slow.

    尽管像加法和减法之类的经典运算符很容易以这种格式实现,但仍然有很多不足之处。 一旦我们想要实现更多的数学运算符,这种实现就会变得很麻烦,而且正如我们稍后将看到的:缓慢。

    任意浮点 (Arbitrary-Floating-Point)

    After some searching in the mathematical realm, I found the arbitrary-floating-point (AFP) class of Henrik Vestermark. This library takes the approach of storing the mathematical mantissa and the fractional part separately. The fractional part is stored in a character array, and interpreted in each mathematical operation. As such, it is an implementation of a precise binary-coded-decimal.

    在数学领域中进行了一些搜索之后,我发现了Henrik Vestermark的任意浮点(AFP)类。 该库采用分开存储数学尾数和小数部分的方法。 小数部分存储在字符数组中,并在每个数学运算中进行解释。 这样,它是精确的二进制编码的十进制的实现。

    The source code of this library is included in the BCD project. But see also the website of “Numerical Methods at Work” at http://hvks.com as this project has evolved since I took the idea from it.

    该库的源代码包含在BCD项目中。 但也请访问http://hvks.com上的“工作中的数字方法”网站,因为自从我从中汲取灵感以来,该项目已经发展起来。

    The downside of this library is (apart from performance problems) that the format is not easily transcoded to database formats like NUMERIC and DECIMAL.

    该库的缺点是(除性能问题外)该格式不易转换为NUMERICDECIMAL类的数据库格式。

    两全其美的 (The Best of Both Worlds)

    Both methods (integer-coded-decimal and arbitrary-floating-point) have led the resulting design of the binary-coded-decimal class here presented. It stores the exponent and the mantissa separately. The mantissa however is stored as a set of integers. In the current configuration, 5 integers for 8 decimal positions each is used. Thus allowing for a mantissa of 40 positions. More than enough to even handle the most demanding database implementation (Oracle with 38 positions).

    两种方法(整数编码的十进制和任意浮点数)都导​​致了此处介绍的二进制编码的十进制类的最终设计。 它分别存储指数和尾数。 但是,尾数存储为一组整数。 在当前配置中,使用8个小数位的5个整数。 因此允许40个位置的尾数。 甚至足以处理最苛刻的数据库实现(拥有38个职位的Oracle)。

    Integers can hold at least 9 decimal places as a positive 32-bit “int” or “long” can hold up to the number of 2.147.483.647. This makes it possible to hold 8 decimal places and still have one digit left to hold any carry or borrow number when iterating over and array of these integers.

    整数可以保留至少9个小数位,因为32位正数“ int ”或“ long ”最多可以容纳2.147.483.647 。 这样就可以保留8个小数位,并且在遍历这些整数和数组时仍可保留一位数字以保留任何进位或借位数字。

    BCD数据类型 (The BCD Datatype)

    The BCD (Binary-Coded-Decimal) datatype was built with database numeric and decimal datatypes in mind. A binary-coded-decimal number is an EXACT number with no rounding errors due to the binary nature of a computer CPU (Central Processing Unit). This makes the bcd datatype especially suited for financial and bookkeeping purposes.

    BCD(二进制编码十进制)数据类型是在考虑数据库数字和十进制数据类型的情况下构建的。 二进制编码的十进制数是由于计算机CPU(中央处理单元)的二进制性质而没有舍入错误的精确数字。 这使得bcd数据类型特别适合于财务和簿记目的。

    BCD calculations have been present in computer science for quite some time, and in various forms. This BCD class was especially designed to co-exist with ODBC database adapters. For more information, see the chapter “BCD and the ODBC Standard”.

    BCD计算已经在计算机科学中存在了很长一段时间,并且形式多样。 该BCD类专门设计用于与ODBC数据库适配器共存。 有关更多信息,请参见“ BCD和ODBC标准 ”一章。

    构建和初始化 (Construction and Initialization)

    You can construct a bcd from just about every base C++ datatype, while initializing the bcd at the same time. This goes for chars, integers, longs, 64bit-integers, floats and doubles.

    您可以从几乎所有基本C ++数据类型构造bcd,同时同时初始化bcd。 这适用于字符,整数,长整数,64位整数,浮点数和双精度数。

    // Made from an integer and a floating point number
    bcd num1(2);
    bcd num2(4.0);
    bcd num3 = num1 + num2;  // will become 6
    
    

    But also for strings and from other bcd number.

    而且还适用于string s和其他bcd编号。

    // Made from a string and a different bcd number
    bcd num4("7.25");
    bcd num5(num3);
    bcd num6 = num4 + num5;  // will become 13.5
    
    

    Here is a complete list of all constructor types:

    这是所有构造函数类型的完整列表:

    • The default constructor (initializes the number to zero (‘0.0’))

      默认构造函数(将数字初始化为零('0.0'))
    • Constructed from a char number (-127 to +127)

      从字符数构造(从-127到+127)
    • Constructed from an unsigned char number (0 upto 255)

      从无符号字符数(0到255)构造
    • Constructed from a short (-32767 upto 32767)

      从短构造(从-32767到32767)
    • Constructed from an unsigned short (0 upto 65535)

      由无符号的short构造(0到65535)
    • Constructed from an integer (-2147483647 upto 2147483647)

      从整数构造(-2147483647至2147483647)
    • Constructed from an unsigned integer (0 upto 4294967295)

      从无符号整数构造(0到4294967295)
    • Constructed from a 64bits integer (-9223372036854775807 upto 9223372036854775807)

      从64位整数构造(-9223372036854775807至9223372036854775807)
    • Constructed from an unsigned 64bits integer (0 upto 18446744073709551615)

      由无符号64位整数(0到18446744073709551615)构造
    • Constructed from another bcd

      从另一个bcd构造
    • Constructed from a string of type CString (MFC)

      从类型为CString (MFC)的string构造

    • Constructed from a string of type “const char *

      从类型为“ const char * ”的string构造

    • Constructed from a SQL_NUMERIC_STRUCT (as appearing in the ODBC standard)

      SQL_NUMERIC_STRUCT构造(如ODBC标准中所示)

    常数 (Constants)

    There are three defined constants in the bcd datatype. These constants are:

    bcd datatype定义了三个常量。 这些常量是:

    • PI: The well known circle/radius ratio

      PI :众所周知的圆/半径比

    • LN2: The natural logarithm of 2

      LN2 :2的自然对数

    • LN10: The logarithm of 10

      LN10 :10的对数

    They appear as “const bcd” numbers and can be used as such. Here are a few simple examples to show their use.

    它们显示为“ const bcd ”数字,因此可以使用。 这里有一些简单的例子来说明它们的用法。

    // Numbers made up with the help of constants
    bcd ratio = 2 * PI();
    bcd quart = bcd::PI() / bcd(2);
    
    

    作业 (Assignments)

    Other bcds, integers, doubles and strings can be assigned to a bcd number. That is: you can use the standard ‘=’ assignment operator or the operators that are combined with the standard mathematical operations ‘+=’, ‘-=’, ‘*=’, ‘/=’ and ‘%=’. Assignment operators made of a combination with bitwise operators like ‘|=’ or ‘&=’ have no logical counterpart in the bcd class, as a bitwise operation has no logical meaning for a binary coded decimal number.

    可以将其他bcd,整数,双精度数和字符串分配给bcd号码。 也就是说:您可以使用标准的'='赋值运算符或与标准数学运算符'+ =','-=','* =','/ ='和'%='结合使用的运算符。 与“ | =”或“&=”之类的按位运算符组合而成的赋值运算符在bcd类中没有逻辑对应项,因为按位运算对二进制编码的十进制数没有逻辑含义。

    // Calculation with assignments
    bcd a = SomeFunc();
    a += 2;
    a *= b;    // a = b + (2 * SomeFunc)
    
    

    增量和减量 (Increments and Decrements)

    Both prefix and postfix increments and decrements can be used with a bcd just as with any integer number.

    前缀和后缀的增量和减量都可以与bcd一起使用,就像与任何整数一样。

    // Calculation with prefix and postfix in- and decrements
    bcd a = ++b;
    bcd c = a--;
    
    

    经营者 (Operators)

    The standard mathematical operators ‘+’ (addition), ‘-‘ (subtraction), ‘*’ (multiplication), ‘/’ (division) and ‘%’ (modulo) are implemented for the bcd class.

    bcd类实现了标准数学运算符'+'(加法),'-'(减法),'*'(乘法),'/'(除法)和'%'(模)。

    As this class is designed to do bookkeeping, it is the ‘bread-and-butter’ of this class. More than eighty percent of all calculations are done in these operators in real-world applications.

    由于本课程旨在进行簿记,因此它是本课程的“头等大事”。 超过80%的计算是在实际应用中的这些运算符中完成的。

    Here is a typical example:

    这是一个典型的例子:

    // Finding an average price from a std::vector of objects
    // Where GetPrice() and GetVAT() both return a bcd value
    bcd total;
    for(auto& obj : objectlist)
    {
       total += obj.GetPrice() + obj.GetVAT();
    }
    bcd average = total / (int)objectlist.count();
    if(average > 400.0)
    {
      ReportAverageToHigh(average);
    }
    
    

    比较 (Comparisons)

    All typical comparison operators like equal (==), not-equal (!=), smaller (<), smaller-than-or-equal-to (<=), greater (>) and greater-than-or-equal-to (>=) are implemented for the bcd class.

    所有典型的比较运算符,例如等于(==),不等于(!=),较小(<),小于等于(<=),大于(>)和大于等于-to(> =)为bcd类实现。

    For an example, see the previous paragraph where we report an average that is too high.

    例如,请参见上一段,其中我们报告的平均值过高。

    数学函数 (Mathematical Functions)

    The C library contains a number of mathematical functions that are solely implemented in the ‘double’ basic datatype. An example of these is, e.g., “pow” for the taking of a power. These functions are implemented as statistical functions with bcds as parameters. Static mathematical functions include:

    C库包含许多仅在' double '基本datatype实现的数学函数。 这些的一个例子是,例如,用于取得权力的“ pow ”。 这些函数被实现为以bcd为参数的统计函数。 静态数学函数包括:

    Apart from the static functions, they are also implemented as methods of the bcd class. So “pow” has a symmetrical method ‘Power’.

    static函数外,它们还作为bcd类的方法实现。 因此,“ pow ”具有对称的“ Power ”方法。

    Image 1

    Here are two examples that do exactly the same:

    这是两个完全相同的示例:

    // Calculate the side of a square
    bcd surface = GetSquareSurfaceArea();
    bcd side = surface.SquareRoot();
    
    

    and:

    和:

    // Calculate the side of a square
    bcd surface = GetSquareSurfaceArea();
    bcd side = sqrt(surface);
    
    

    NOTE: Overloading the mathematical functions make is meant to make it easier to port existing code with doubles to be converted into bcds.

    注意 :重载数学函数make的目的是使移植带有double s的现有代码更容易,以将其转换为bcd s。

    三角函数 (Trigonometric Functions)

    The standard C trigonometric functions are overloaded for the bcd class as is the case with the standard mathematical functions. Just as with the standard trigonometric functions, the number is an angle measured in radians. The following functions exist:

    标准C三角函数对于bcd类是重载的,就像标准数学函数一样。 就像标准三角函数一样,数字是一个以弧度为单位的角度。 存在以下功能:

    Image 2

    Here are two examples that do exactly the same:

    这是两个完全相同的示例:

    // Calculate the height of a given wave
    bcd waveHeight = GetSignal().Sine();
    
    

    and:

    和:

    // Calculate the height of a given wave
    bcd waveHeight = sin(GetSignal());
    
    

    转换次数 (Conversions)

    It is possible to convert a bcd to ‘something-else’. This other ‘something’ is a base datatype from the C++ language. Most methods are named something like “AsXXXX”, where XXXX denotes the type we want. The following methods exist:

    可以将bcd转换为“ something-else”。 其他“内容”是C ++语言的基本数据类型。 大多数方法的名称都类似于“ AsXXXX ”,其中XXXX表示我们想要的类型。 存在以下方法:

    Image 3

    Here is an example of a calculation returning an engineering number string in 10 exponential format.

    这是一个以10指数格式返回工程编号string的计算示例。

    // Return a calculation in a IEEE number string
    CString GetCalculation()
    {
      bcd number1 = SomeFunction();
      bcd number2 = AnotherFunction();
      bcd number3 = number1.Power(number2);
    
      // Something like "5.6773E-03"
      return number3.AsString(Engineering,false);
    }
    
    

    字符串显示 (String Display)

    Numbers can be displayed as strings. How they are displayed depends on the application we are using the number in. This can be quite different for a scientific or engineering application in contrast to a bookkeeping application. The differences are loosely defined as:

    数字可以显示为string s。 如何显示它们取决于我们在其中使用数字的应用程序。与簿记应用程序相比,对于科学或工程应用程序,这可能会大不相同。 差异大致定义为:

    1. n bookkeeping applications, we tend to display numbers with one decimal marker and as much thousand parts markers as needed. We display decimal places upto a defined amount and round of the rest of the decimal places;

      在簿记应用程序中,我们倾向于显示带有一个小数点标记和需要的千位标记的数字。 我们将显示小数位数(最多定义的数量),并显示其余的小数位数;
    2. In engineering applications, we tend to print the exact number just with one decimal marker. If the number gets to great (or to small) we shift to exponential display in powers of ten.

      在工程应用中,我们倾向于只用一个小数点标记打印出准确的数字。 如果数字变大(或变小),我们将以十次幂转换为指数显示。
    3. In both cases, we always print a negative number with a negative sign (-), but we can choose to print the positive sign (+) as well;

      在这两种情况下,我们总是打印带有负号(-)的负号,但是我们也可以选择打印带有正号(+)的负号;
    4. The decimal and thousand markers are defined by the current system local of the machine and thus the language the desktop is currently using.

      小数点和千位标记由计算机的当前系统本地定义,因此由桌面当前使用的语言定义。

    Here are a few examples of both ways of displaying a number:

    以下是两种显示数字的方式的示例:

    Image 4

    文件读写 (File Reading and Writing)

    Applications might need to write information to a binary file. So there are two methods for integration with binary files. The first (WriteToFile(FILE*)) writes the bcd number to a file. The second (ReadFromFile(FILE*)) reads the bcd number back from that file. All primary factual information of the bcd number is stored.

    应用程序可能需要将信息写入二进制文件。 因此,有两种与二进制文件集成的方法。 第一个( WriteToFile(FILE*) )将bcd编号写入文件。 第二个( ReadFromFile(FILE*) )从该文件中读取bcd编号。 存储了bcd编号的所有主要事实信息。

    Any disturbance in the force (oh sorry: the file) will lead to an error, meaning the whole number gets stored or read back, or an error occurs. See the implementation for more details about the storing format of the bcd.

    力的任何干扰(抱歉:文件)都将导致错误,这意味着整数会被存储或读回,或者发生错误。 有关bcd的存储格式的更多详细信息,请参见实现。

    Storage and retrieval of the bcd number in the file is also network independent and little-big-endian independent, meaning you can store and retrieve the number in a portable way.

    文件中的bcd编号的存储和检索也与网络无关,并且与little-big-endian无关,这意味着您可以通过便携式方式存储和检索该bcd编号。

    信息及其他方法 (Information and Other Methods)

    A number of methods exist that have not yet been discussed. The give information of some property of the bcd number or do a basic operation. Here is the remainder list:

    存在许多尚未讨论的方法。 提供bcd编号某些属性的信息或执行基本操作。 以下是剩余清单:

    Image 5

    错误处理 (Error Handling)

    Error handling is done by throwing a StdException. This exception is integrated with the MS-Windows C++ Safe Exception Handling in such a way that critical errors like null-pointer references and division-by-zero errors do **NOT** get a different exception handling – stopping the application, e.g., – but are integrated in the exception throwing.

    通过抛出StdException来完成错误处理。 该异常与MS-Windows C ++安全异常处理集成在一起,使得诸如null指针引用和零除错误之类的严重错误确实无法获得不同的异常处理–停止应用程序,例如, –但已集成到异常抛出中。

    Here is a list of all errors in the bcd class. There descriptions are meant to be self-explanatory:

    这是bcd类中所有错误的列表。 这里的描述是不言自明的:

    Image 6

    增强和完善 (Enhancements and Refinements)

    The bcd class can easily be enhanced. You can simply expand the number of digits in the mantissa by using a greater number on integers in the mantissa array. See the constants “bcdDigits” and “bcdLength” at the beginning of the class interface definition.

    bcd类可以轻松增强。 您可以通过在尾数数组中的整数上使用更大的数字来简单地扩展尾数中的位数。 请参见类接口定义开头的常量“ bcdDigits ”和“ bcdLength ”。

    Extra methods and / or data, operators, stream interfaces like std::iostream can easily be added to this class.

    可以轻松地将额外的方法和/或数据,运算符,流接口(如std::iostream添加到此类。

    The bcd project comes with a unit test module DLL. The goal of the unit test is, of course, to test the correct workings of the other functionality while you expand the class.

    bcd项目带有一个单元测试模块DLL。 当然,单元测试的目标是在扩展类时测试其他功能的正确运行。

    Just open the test explorer in Visual Studio (from the menu “Test” / “Run all tests”) and check that all unit test are ‘in-the-green’.

    只需在Visual Studio中打开测试资源管理器(从菜单“ 测试 ” /“ 运行所有测试 ”),并检查所有单元测试是否为“绿色”。

    Image 7

    BCD和ODBC标准 (BCD and the ODBC Standard)

    Now with the mathematical calculations firmly in place, we can turn to the usage of the bcd number in combination with the ODBC drivers. Binary data flows to and from the ODBC driver of a database in the form of the SQL_NUMERIC_STRUCT. This struct supports both the NUMERIC and DECIMAL datatypes of a modern ISO:9075 compliant SQL database.

    现在已经有了正确的数学计算,我们可以将bcd编号与ODBC驱动程序结合使用。 二进制数据以SQL_NUMERIC_STRUCT的形式流入和流出数据库的ODBC驱动程序。 该struct支持现代ISO:9075兼容SQL数据库的NUMERICDECIMAL datatype

    Binding directly to a DECIMAL or NUMERIC column in a database query will result in the retrieval of a SQL_NUMERIC_STRUCT in memory. Changing and using that struct in an update or insert statement will use the contents of that struct and transport it to our database record.

    直接绑定到数据库查询中的DECIMALNUMERIC列将导致在内存中检索SQL_NUMERIC_STRUCT 。 在updateinsert语句中更改并使用该struct将使用该struct的内容并将其传输到我们的数据库记录中。

    But what happens when we get that data. Peeking at the source code of some open-source database implementations like the MySql, MariaDB, Firebird or PostgreSQL reveals that most odbc drivers just convert a string to a SQL_NUMERIC_STRUCT. At the moment that this dataclass was written, those conversions were quite complicated, long and error prone. In the last years, the situation has improved, but…

    但是,当我们获得这些数据时会发生什么。 偷看MySql,MariaDB,Firebird或PostgreSQL等一些开源数据库实现的源代码,发现大多数odbc驱动程序只是将string转换为SQL_NUMERIC_STRUCT 。 在编写此dataclass的那一刻,这些转换非常复杂,冗长且容易出错。 在过去的几年中,情况有所改善,但是…

    1. This conversion only converts the standard number format with a decimal point. No exponential numbers can be converted.

      此转换仅转换带小数点的标准数字格式。 不能转换指数数。
    2. A lot of confusion still exists in the usage of NUMERIC and DECIMAL. Looking up answers on the stackoverflow platform, even experienced programmers opt-in to let the database convert the data to a string and plucking that string data out of the query.

      NUMERICDECIMAL的用法仍然存在很多困惑。 在stackoverflow平台上查找答案时,甚至有经验的程序员都选择让数据库将数据转换为字符串并将该string数据从查询中删除。

    The BCD class has been designed to easily convert to and from the SQL_NUMERIC_STRUCT. With the following two methods:

    BCD类被设计为可以轻松地与SQL_NUMERIC_STRUCT转换。 用以下两种方法:

    • bcd::SetValueNumeric(SQL_NUMERIC_STRUCT*);

      bcd::SetValueNumeric(SQL_NUMERIC_STRUCT*);

    • bcd::AsNumeric(SQL_NUMERIC_STRUCT*);

      bcd::AsNumeric(SQL_NUMERIC_STRUCT*);

    Data is directly converted to and from the ODBC bind area and to the database. These conversions are a simple iteration over the mantissa and copy of the mantissa and sign bit.

    数据直接与ODBC绑定区域和数据库之间进行转换。 这些转换是对尾数以及尾数和符号位的副本进行的简单迭代。

    主要优势 (The Main Advantage)

    The key factor here is that we can directly use our NUMERIC and DECIMAL numbers without having them to convert first to a string and back to a format where we can begin calculations in them. Round-about the other direction: we can directly calculate and store the result in the database without having to convert everything to strings and order the database to convert it back to exactly the same data again!

    这里的关键因素是我们可以直接使用我们的NUMERICDECIMAL数字,而无需先将它们转换为string然后再转换为可以在其中开始计算的格式。 绕过另一个方向:我们可以直接计算结果并将其存储在数据库中,而不必将所有内容都转换为string s,并且可以命令数据库再次将其转换回完全相同的数据!

    SQL组件 (SQLComponents)

    The main application of the bcd class lies within the SQLComponents library. This is a library around the ODBC driver. You can find this library at https://github.com/edwig/SQLComponents.

    bcd类的主要应用程序位于SQLComponents库中。 这是一个围绕ODBC驱动程序的库。 您可以在https://github.com/edwig/SQLComponents中找到该库。

    In this library, all datarows are bound to a SQLRecord object. The columns of each record in turn are bound to the SQLVariant class.

    在此库中,所有datarow均绑定到SQLRecord对象。 每个记录的列又绑定到SQLVariant类。

    The SQLVariant class acts as a sorts of variable placeholder for all datatypes that can be obtained from a database row. And of course: one of the datatypes is the bcd class.

    SQLVariant类充当可从数据库行获取的所有datatype的变量占位符。 当然: datatype s之一是bcd类。

    The SQLComponents database makes it easier to program with any given ODBC driver. It has been tested with Oracle, MS-SQLServer, MySQL, PostgreSQL, MS-Access and IBM-Informix.

    SQLComponents数据库使使用任何给定的ODBC驱动程序编程变得更加容易。 它已经过Oracle,MS-SQLServer,MySQL,PostgreSQL,MS-Access和IBM-Informix的测试。

    打开ODBCQuerytool (The Open ODBCQuerytool)

    Apart from a number of business applications, the one and only killer-app that’s using the SQLComponents and bcd class is the Open ODBC-Querytool. You can find this querytool through github on: https://github.com/edwig/ODBCQueryTool and on sourceforge under the following link: https://sourceforge.net/projects/odbcquerytool/. From this last link, it has seen more than 50.000 downloads in the last years.

    除了许多业务应用程序之外,使用SQLComponents和bcd类的唯一且唯一的杀手级应用程序是Open ODBC-Querytool。 您可以通过以下网址的 github找到此查询工具: https : //github.com/edwig/ODBCQueryTool以及sourceforge下的以下链接: https ://sourceforge.net/projects/odbcquerytool/。 从最后一个链接看,最近几年下载量已超过50.000。

    绩效评估 (Performance Measuring)

    In order to be able to measure the performance of my implementations, I designed a test program that does any number of calculations a configurable number of times ‘n’. When setting ‘n’ to for instance a 1000 times, the length of the calculations will be great enough to be able to measure it with a high performance counter like “QueryPerformanceCounter” of the MS-Windows kernel.

    为了能够衡量我的实现的性能,我设计了一个测试程序,该程序可以按可配置的次数“ n ”进行任意数量的计算。 当将“ n ”设置为例如1000倍时,计算长度将足够大,从而能够使用诸如MS-Windows内核的“ QueryPerformanceCounter ”之类的高性能计数器进行测量。

    The test program compares the result of each operation with the result of the MS-Windows desktop calculator “calc.exe” and shows the performance results of four implementations:

    测试程序将每个操作的结果与MS-Windows桌面计算器“ calc.exe ”的结果进行比较,并显示四种实现的性能结果:

    1. C++ built-in “double

      C ++内置“ double

    2. Arbitrary-floating-point

      任意浮点
    3. Integer-coded-decimal

      整数编码的十进制
    4. Binary-coded-decimal

      二进制编码的十进制

    A typical output of the test program looks like:

    测试程序的典型输出如下所示:

    Testing the function [log10] for a total of [1000] iterations:
    
    Input: 98765432109876543210.123456789012345678901234567890
    
    Type         Time Value
    ------ ---------- ------------------------------------------------------
    calc     0.000000 +19.994604968162151965673558368195
    double   0.000005 +19.994604968162150
    afp      0.982142 +19.99460496816215196567355836819543212297
    icd      0.191501 +19.9946049681621519656735583681954349795885
    bcd      0.050899 +19.9946049681621519656735583681954321229
    
    

    In this example, we see the results for the “log10” function (logarithm in base 10). As we can see, the result is correct upto at least 32 decimal places for each implementation (apart from ‘double’ ☹)

    在此示例中,我们看到“ log10 ”函数的结果(以10为底的对数)。 如我们所见,对于每个实现,结果至少在小数点后32位都是正确的(除了'double'☹)

    A thousand iterations take 0,05 seconds in the bcd implementation: 50 microseconds each. Quite a bit longer than the 50 nanoseconds for a double calculation. But at a far greater precision!

    在bcd实现中,一千次迭代需要0.05秒:每次50微秒。 重复计算的时间比50纳秒长一点。 但是精度更高!

    The BCD solution in the example program runs this test by default.

    示例程序中的BCD解决方案默认运行此测试。

    This is a screenshot of the beginning of the testrun:

    这是测试运行开始的屏幕截图:

    Image 8

    And here is a sample of the output at the end of the testrun:

    这是测试运行结束时的输出示例:

    Image 9

    In a test run in the mode of 1000 iterations on a modern Intel Core i7-7700K CPU with an ASUS Z270 motherboard we can now compare the timings of all mathematical functions. Here is a typical end result, shown in a table:

    现在,在带有ASUS Z270主板的现代Intel Core i7-7700K CPU上以1000次迭代的模式进行测试,我们现在可以比较所有数学函数的时序。 下表显示了典型的最终结果:

    图片10
    ()

    结论 (Conclusion)

    From the performance table above it’s clear that the best performance is of course the built-in double datatype. But that’s with rounding errors and all. From the other solutions (straight 8 bits BCD by the AFP solutiohn, the integer-coded-decimal and the bcd-class) the bcd is the winner in all categories of calculations but one (addition). In those cases where bcd has the highest performance it can be from a few percent upto a staggering factor of 20 or 50 times faster or even higher.

    从上面的性能表可以明显看出,最佳性能当然是内置的double数据类型。 但这就是四舍五入的错误。 从其他解决方案(AFP解决方案使用直8位BCD,整数编码的十进制和bcd类)中,bcd在所有计算类别中都是赢家,但一个(加法)则是赢家。 在bcd的性能最高的情况下,其速度可能从百分之几提高到惊人的20或50倍甚至更高。

    Github (Github)

    This project is also to be found on: https://github.com/edwig/bcd.

    您也可以在以下位置找到该项目: https : //github.com/edwig/bcd

    翻译自: https://www.codeproject.com/Articles/5254478/Binary-Coded-Decimal

    展开全文
  • 首先将二进制数值(32定点数,末16位代表小数)由PC写入串口小助手,传给FPGA,再将转化后的结果由串口传到PC端显示,整体的过程比较简单,这部分以后再讲,今天主要来讲讲小数部分的二进制十进制。  首先关于...
  • 众所周知,计算机中使用的是二进制运算规则,能够读懂二进制语言,但究竟什么是进制?进制之间是如何相互转化的?今天我们就来详细了解下。
  • 二进制和格雷码之间的转换

    千次阅读 2020-07-20 15:20:01
    文章目录格雷码特点二进制和格雷码对照表二进制转格雷码HDL实现格雷码转二进制HDL实现参考资料 格雷码特点 格雷码属于可靠性编码,是一种错误最小化的编码方式。因为,虽然自然二进制码可以直接由数/模转换器转换成...
  • 1、不使用字符串操作函数,把一个十进制字符串转换成二进制字符串 函数原型: char* Dec2Bin(const char* dec, char* bin, int size) { } 调用: { char szBuff[33]; const char* test = "0096"; cout (test, ...
  • 例如2157的千位是2,百位是1,位是5,个位是7,可以写成:2 x 1000 + 1 x 100 + 5 x 10 + 7 x 1注意,1000是10的立方(即3次幂),100是10的平方(即2次幂),10是10的1次幂,而且10(以及任意正数)的0次幂是1。...
  • 简单来说就是把二进制码右移一位再与二进制异或。 assign wr_poi_gray = wr_poi ^ (wr_poi>>1); //produce wr pointer gray code; 格雷码转二进制: 格雷码转二进制是从左边第二位起,将每位与左边一位二进制...
  • 6-8 十进制转换二进制 本题要求实现一个函数,将正整数n转换为二进制后输出。 函数接口定义: void dectobin( int n ); 函数dectobin应在一行中打印出二进制的n。建议用递归实现。 裁判测试程序样例: #include &...
  • 格雷码和二进制相互转换

    千次阅读 2019-04-15 20:41:15
    格雷码和二进制相互转换 格雷码(Gray code)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,是一种绝对编码方式,典型格雷码是一种具有反射特性循环特性的单步自补码,它的循环、单步特性消除了...
  • 解决此类问题的方法可能不止以下这两类方式(十进制转化为其它进制也是同样的道理,在此仅以转化为二进制为例),在此只对两类方式的一种解法加以解释,其余方式暂不再此次讨论范围内。 方式一:递归 递归算法优势...
  • 格雷码属于可靠性编码,是一种错误最小化的编码方式,因为虽然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的 3 转换为 4 时二进制码的每一位都要变,能使数字电路产生
  • 1详细二进制 (主要是用于基本i/o流) #二进制: 1、计算机内部都是2进制 2、数组ArrayList的区别:ArrayLlsit里面有算法(通用算法,只有当通用算法不行的时候,可以自己写专门算法),数组没有相应的算法,...
  • 三进制逻辑电路比二进制逻辑电路速度更快、可靠性更高,而且需要的设备电能也更少。三进制代码的一个特点是对称,即相反数的一致性,因此它和二进制代码不同,不存在无符号数的概念。这样,三进制计算机的架构也要...
  • 因为计算机底层是通过二进制来进行计算的,所以在计算机底层会将十进制转换为二进制十进制就是逢10进1,二进制就是逢2进1。 就十进制来说,比如一百可以分为三位,个位、十位、百位, 用位数在下列表示 101这个...
  • 文本文件和二进制文件详解(转)

    千次阅读 2017-05-26 22:19:38
    转自:...2)二进制文件:这类文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像
  • 1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。 41bit-时间戳,用来记录时间戳,毫秒级。 - 41位可以表示个数字, - 如果只用来表示正整数...
  • 二进制位运算符

    2021-10-08 11:21:45
    二进制位运算符用于直接对二进制位进行计算,一共有7个。 二进制或运算符(or):符号为|,表示若两个二进制位都为0,则结果为0,否则为1。 二进制与运算符(and):符号为&,表示若两个二进制位都为1,则结果...
  • 二进制二进制是数学数字电路中使用的记数系统,计算机使用的是二进制。因为电子器件只有通电不通电两种状态,二进制方便计算机进行运算。 用打地鼠解释二进制:先解释一下二进制,举个例子,大家应该都玩过打...
  • 二进制应用

    千次阅读 2020-05-05 22:19:03
    本文将详述JAVA中二进制的应用,提升...一、什么是二进制 逢二进一的计数规则 规律:数字 0,1 进位基权:2 权:8、4、2、1 是基数的幂次。 二、为什么要用二进制 成本最优的解决方案 三、如何用二进制 3.1 ...
  • ASCII码只有128个字符,在本页面直接按Ctrl+F输入你要查找的字符查询对应的ASCII吗,或者输入ASCII值(二进制、八进制、十进制、十六进制)查找对应的字符。 简介 ASCII(AmericanStandardCode ...
  • 格雷码:又叫循环二进制码或反射二进制码。格雷码是我们在旋转编码器中常会遇到的一种编码方式。格雷码的特点:任意两个相邻的代码只有一位二进制数不同;循环码,0最大数(2^n-1)之间只有一位不同;镜像对称,0-(2...
  • 二进制编码

    千次阅读 2020-03-08 00:49:16
    0011这个二进制数,对应的十进制表示 −1×23+0×22+1×21+1×20 -1×2^3+0×2^2+1×2^1+1×2^0 −1×23+0×22+1×21+1×20 这种方法可以表示从-8到7这16个整数,不会白白浪费一位。 用8位二进制中的128个不同...
  • 位图模拟二进制的加1【建议采用】 当所有位均为1时,返回false; 否则返回true,表示还可以继续增加 boolIncrement(bitset&bits)  {   if(CHAR_COUNT  return false;   for(int i = CHAR_COUNT-1; i >=0; i--)...
  • 使用二进制位来控制权限,表设计

    千次阅读 2019-09-10 19:27:31
    前言 最近在自己搭建一个管理后台,到了权限角色的时候,按常规涉及了以下几张表: 也是相当常见的模型了。 但是随机我发现一个不大不小的问题,当权限表/...我们知道一个long类型,可以转为64位的二进制类型,也...
  • 使用二进制来表示数据状态

    千次阅读 2020-04-30 14:51:44
    使用二进制的方式来表示数据状态(支持无顺序状态) 文章目录使用二进制的方式来表示数据状态(支持无顺序状态)1. 背景介绍2. 通过一个案例引发思考2.1 当签章有顺序时,我们是如何设计的?2.2 当签章顺序无法控制...
  • 二进制与格雷码互相转换

    千次阅读 多人点赞 2021-03-10 19:12:18
    格雷码,是一种二进制循环码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以避免二进制编码计数组合电路中出现的亚稳态。格雷码常用于通信,异步 FIFO或者 RAM 地址寻址...
  • 原码,反码,补码,都是计算机用二进制来表示数据的,计算机表示数据是由数据长度符号位表示的,首位表示符号位,0表示正数,1表示负数,剩下的数据表示所要表示的数据。 什么是数据长度? 就是我们说的位数,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 54,024
精华内容 21,609
关键字:

二进制和十进制的优缺点