标签: bcd

使二进制加法的行为类似于(压缩)十进制加法

我目前正在开发一个限制性环境,其中允许的唯一类型是:

byte, byte[], short, short[].
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定我无法导入外部库,因为我正在研究JavaCard,并且已经尝试过这样的事情,但结果并不好.

所以,在这里我必须管理一个大小为6字节的字节数组,它代表卡的余额(欧元),最后一个字节是美分,但现在这并不重要.

鉴于我无法访问整数,我不知道如何以我想要的方式添加两个字节.

我们举个例子:

用户输入(添加)0x00 0x00 0x00 0x00 0x00 0x57,这对用户来说意味着增加57美分.我们现在说平衡是0x00 ... 0x26.

我希望能够创建一种方法,可以修改平衡数组(带有进位),添加后,分数为83,并表示0x83.我也必须处理减法,但我想我之后可以自己解决这个问题.

我的第一个猜测是掩盖每个字节的每个数字,并且首先单独工作,但这让我无处可去.

我显然不是要求一个完整的解决方案,因为我相信我的问题几乎是不可能的,但如果你对如何处理这个问题有任何想法,我将非常感激.

那么如何在Java Card上相互添加两个包含二进制编码小数的数组呢?


编辑1:常见的数组如下所示:

{ 0x00 , 0x00 , 0x01, 0x52, 0x45, 0x52}
Run Code Online (Sandbox Code Playgroud)

并且代表15 254€和52美分的大端BCD编码整数.


编辑2:嗯,我怀疑,我的卡不支持包framework.math,所以我不能使用BCDUtil或BigNumbers,这将是有用的.

java javacard bcd

6
推荐指数
1
解决办法
175
查看次数

将BCD转换为二进制的最有效方法

我有下面的代码将32位BCD值(以两个uint half提供)转换为uint二进制值.

提供的值最大为0x9999,最大值为0x99999999.

是否有更好(即更快)的方法来实现这一目标?

    /// <summary>
    /// Convert two PLC words in BCD format (forming 8 digit number) into single binary integer.
    /// e.g. If Lower = 0x5678 and Upper = 0x1234, then Return is 12345678 decimal, or 0xbc614e.
    /// </summary>
    /// <param name="lower">Least significant 16 bits.</param>
    /// <param name="upper">Most significant 16 bits.</param>
    /// <returns>32 bit unsigned integer.</returns>
    /// <remarks>If the parameters supplied are invalid, returns zero.</remarks>
    private static uint BCD2ToBin(uint lower, uint upper)
    {
        uint binVal = 0;

        if …
Run Code Online (Sandbox Code Playgroud)

c# binary bcd

5
推荐指数
3
解决办法
1万
查看次数

将真正的大数字从二进制转换为十进制并打印出来

我知道如何将二进制转换为十进制.我知道至少2种方法:桌子和电源;-)

我想将二进制转换为十进制并打印此十进制.而且,我对这个"十进制"不感兴趣; 我想要打印它.

但是,正如我上面所写,我只知道将二进制转换为十进制的两种方法,并且它们都需要添加.所以,我在二进制中计算1或0的某个值,并将其添加到记忆值.这是一个很薄的地方.我有一个非常大的数字(1和64个零).转换时我需要在某些"变量"中放置一些中间结果.在C中,我有一个`int'类型,它只有4个字节,不超过10 ^ 11.

因此,在从二进制转换为十进制时,我没有足够的内存来存储中间结果.正如我上面所写,我对这个小数点不感兴趣,我只想打印结果.但是,我没有看到任何其他方法来解决它;-(是否有任何解决方案从二进制"只打印"?

或者,也许,我应该使用类似BCD(二进制编码的十进制)的东西进行中间表示?我真的不想用这个,因为它不是那么跨平台(英特尔的处理器有内置功能,但对于其他我需要编写自己的实现).

我很高兴听到你的想法.谢谢你的耐心等待.

语言:C

c binary decimal bignum bcd

5
推荐指数
2
解决办法
7960
查看次数

将int转换为BCD字节数组

我想使用BCD将int转换为byte [2]数组.

有问题的int将来自表示Year的DateTime,必须转换为两个字节.

是否有任何预制功能可以做到这一点,或者你能给我一个简单的方法吗?

例:

int year = 2010
Run Code Online (Sandbox Code Playgroud)

输出:

byte[2]{0x20, 0x10};
Run Code Online (Sandbox Code Playgroud)

.net c# encryption bcd

5
推荐指数
1
解决办法
2万
查看次数

Verilog中的BCD加法器

我正在尝试在Verilog中编写BCD加法器,但我遇到了其中一个模块的问题.具体来说,加法器采用两个BCD数字并添加它们.因此,想法是如果两个数字的总和小于或等于9,那么它是正确的.但是,如果它更大,则必须添加6的偏移量.到目前为止,这是我的Verilog代码:

module DIGITADD(
    input [3:0] IN_A,
    input [3:0] IN_B,
    input CIN,
    output reg COUT,
    output reg [3:0] SUM
);

wire s2, c2;

always @ ( * ) 
begin
 assign {c2, s2} = IN_A + IN_B + CIN;

 if(s2 <= 9 && c2 == 0) begin
  assign {COUT, SUM} = {c2, s2};
 end
 else if({c2, s2} > 9) begin
  assign {COUT, SUM} = {c2, s2 + 6};
 end
end
endmodule
Run Code Online (Sandbox Code Playgroud)

无论如何,当我尝试在Xilinx中进行综合时,我会收到以下错误:

错误:HDLC编译器:247 - "DIGITADD.v"第33行参考标量线'c2'不是合法的注册或变量左值

错误:HDLCompilers:247 - "DIGITADD.v"第33行参考标量线's2'不是合法的注册或变量左值

错误:HDLC编译器:42 - "DIGITADD.v"第33行程序分配的非法左侧

我尝试改变一些事情,比如把电线改成reg,但我仍然无法让它工作.任何帮助表示赞赏.

verilog sum hdl bcd

5
推荐指数
1
解决办法
2万
查看次数

C#Byte []到BCD,BCD到INT

我有一个由CashRegister Machine创建的Hex文件.我必须阅读此文件.

文件使用下面详述的格式.它就像套接字数据包.

代码数据:2字节
PLU代码数据:7字节
单价价格数据:5字节
数量数据:5字节
总数据数据:5字节
PLU名称数据:18字节
税率数据:1字节
长度:24 + 19字节

  • PLU代码格式是BCD
  • 单价1-9999999999(BCD)
  • 数量1-9999999999(BCD最后3个数字应为十进制)
  • 总金额1-9999999999(BCD)

我用二进制读取器读取hex文件,然后插入单位价格字节数组.

byte[] bytes = { data[21], data[22], data[23], data[24], data[25] }; // BCD Byte Array
Run Code Online (Sandbox Code Playgroud)

这个数组是单价.但是,如何将此数字转换为十进制数.并且信息说数量:BCD最后一个数字应该是十进制 - 这是什么意思?谢谢.

c# arrays byte bcd

5
推荐指数
3
解决办法
2万
查看次数

自补码(超额3,84-2-1,2*421)

我在这里有一个主题,来自"计算机组织与架构简介"主题中的"数字系统"

然后我遇到了这个话题,"自我补充代码"

它有3个部分如下:

i)Excess-3(我理解这一部分,因为它要求我们在BCD上加3)

ii)84-2-1(我不明白)

iii)2*421(我不明白)

我希望有人可以解释第ii和iii部分是如何工作的.

非常感谢.

bcd

5
推荐指数
2
解决办法
6万
查看次数

如何将BCD转换为十进制?

如何在表示方面将二进制编码的十进制数转换为十进制数?我不想转换它的值,而是它的表示,这就是我的意思.

我想转换0x11成十进制11(不17),并0x2020(不32).

unsigned char day = 0x11;
unsigned char month = 0x12;

int dayDecimal, monthDecimal;
Run Code Online (Sandbox Code Playgroud)

我希望dayDecimal 11和monthDecimal = 12.我将使用0x00到0x60之间的范围,所以它应该是可能的.不会有'A','B','C','D','E','F.

更新:

我实际上是从RTCC芯片中读取时间,作为我正在进行的嵌入式项目的一部分.以该形式返回小时,分钟,日和月.例如,如果分钟是0x40则表示40分钟而不是64分钟,所以我需要能够正确地解释它.我需要以某种方式将0x40转换为40而不是64.我希望这是可能的.

谢谢!

c bcd

5
推荐指数
2
解决办法
3万
查看次数

装配说明:AAA

我正在看伪代码:BCD指令的隐藏能力.以下是该网站内容的片段:

那么,让我们来看看AAA的作用.这是伪代码等价物(来自英特尔):

   IF ((AL AND 0FH) > 9) OR (AF = 1)
    THEN
            AL = (AL + 6) AND 0FH;
            AH = (AH + 1);
            AF = 1;
            CF = 1;
    ELSE
            AF = 0;
            CF = 0;
    FI;enter code here
Run Code Online (Sandbox Code Playgroud)

对于像这样的典型英特尔文档兼容用途,这是正确的:

    mov     al,6
    add     al,9    ;al=15=0Fh
    aaa             ;al=21=15h  =>  it's in decimal!
Run Code Online (Sandbox Code Playgroud)

上面的算法似乎没有在代码中给出结果,所以我假设这里省略了一些步骤.评论说明如下:"al = 21 = 15h =>它是十进制的!".

我对代码的解释如下:

  • 在add指令之后,存储在AL寄存器中的值将为15(0Fh).
  • 由于它大于10,因此将向该值添加6,并且使用0Fh进行AND运算,这将导致1s值存储在AL寄存器中("AL =(AL + 6)AND 0FH;").AL寄存器的值现在应为05h.
  • 算法在AH寄存器中加一个,我假设是寄存器,因为我们对AL寄存器进行了ANDed和归零4位("AH =(AH + 1);").

但是,在运行"AH =(AH + 1);"行之前,没有提到存储在AH寄存器中的值.如果它被初始化为零,它只适用于20以下的数字.现在我们假设它被初始化为零,我希望结果存储为AH = 1和AL = 5,但评论说"; …

x86 assembly bcd x86-16 80286

5
推荐指数
1
解决办法
1263
查看次数

英特尔8085组件中的bitshift操作有什么作用?

我试图向自己解释以下8085汇编代码

我有这个代码要求两个数字(来自IDE中的虚拟键盘)并在LED 7和8上显示它们:

.ORG 0000

CALL DATA
MOV C,A
CALL PRNT

CALL DATA
MOV E,A
CALL PRNT

MVI D,00H
MOV L,E
MVI H,00H

MOV A,C
DCR A
JUMP:
DAD D
DCR A
JNZ JUMP

MOV A,L
DAA
JMP IMPR

RET

DATA:
MVI A,00000000B
OUT 00H
IN 00H
RLC
RLC
RLC
RLC
ANI F0H
MOV B,A
MVI A,00000000B
OUT 00H
IN 00H
ANI 0FH
ORA B
RET

IMPR:
MOV B,A

ANI F0H
RLC
RLC
RLC
RLC
CALL NUMZ
OUT 06H
MOV …
Run Code Online (Sandbox Code Playgroud)

assembly bitwise-operators bcd 8085

4
推荐指数
1
解决办法
1321
查看次数

标签 统计

bcd ×10

c# ×3

assembly ×2

binary ×2

c ×2

.net ×1

80286 ×1

8085 ×1

arrays ×1

bignum ×1

bitwise-operators ×1

byte ×1

decimal ×1

encryption ×1

hdl ×1

java ×1

javacard ×1

sum ×1

verilog ×1

x86 ×1

x86-16 ×1