我目前正在开发一个限制性环境,其中允许的唯一类型是:
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,这将是有用的.
我有下面的代码将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) 我知道如何将二进制转换为十进制.我知道至少2种方法:桌子和电源;-)
我想将二进制转换为十进制并打印此十进制.而且,我对这个"十进制"不感兴趣; 我想要打印它.
但是,正如我上面所写,我只知道将二进制转换为十进制的两种方法,并且它们都需要添加.所以,我在二进制中计算1或0的某个值,并将其添加到记忆值.这是一个很薄的地方.我有一个非常大的数字(1和64个零).转换时我需要在某些"变量"中放置一些中间结果.在C中,我有一个`int'类型,它只有4个字节,不超过10 ^ 11.
因此,在从二进制转换为十进制时,我没有足够的内存来存储中间结果.正如我上面所写,我对这个小数点不感兴趣,我只想打印结果.但是,我没有看到任何其他方法来解决它;-(是否有任何解决方案从二进制"只打印"?
或者,也许,我应该使用类似BCD(二进制编码的十进制)的东西进行中间表示?我真的不想用这个,因为它不是那么跨平台(英特尔的处理器有内置功能,但对于其他我需要编写自己的实现).
我很高兴听到你的想法.谢谢你的耐心等待.
语言:C
我想使用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) 我正在尝试在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,但我仍然无法让它工作.任何帮助表示赞赏.
我有一个由CashRegister Machine创建的Hex文件.我必须阅读此文件.
文件使用下面详述的格式.它就像套接字数据包.
代码数据:2字节
PLU代码数据:7字节
单价价格数据:5字节
数量数据:5字节
总数据数据:5字节
PLU名称数据:18字节
税率数据:1字节
长度:24 + 19字节
我用二进制读取器读取hex文件,然后插入单位价格字节数组.
byte[] bytes = { data[21], data[22], data[23], data[24], data[25] }; // BCD Byte Array
Run Code Online (Sandbox Code Playgroud)
这个数组是单价.但是,如何将此数字转换为十进制数.并且信息说数量:BCD最后一个数字应该是十进制 - 这是什么意思?谢谢.
我在这里有一个主题,来自"计算机组织与架构简介"主题中的"数字系统"
然后我遇到了这个话题,"自我补充代码"
它有3个部分如下:
i)Excess-3(我理解这一部分,因为它要求我们在BCD上加3)
ii)84-2-1(我不明白)
iii)2*421(我不明白)
我希望有人可以解释第ii和iii部分是如何工作的.
非常感谢.
如何在表示方面将二进制编码的十进制数转换为十进制数?我不想转换它的值,而是它的表示,这就是我的意思.
我想转换0x11成十进制11(不17),并0x20以20(不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.我希望这是可能的.
谢谢!
我正在看伪代码: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 =>它是十进制的!".
我对代码的解释如下:
但是,在运行"AH =(AH + 1);"行之前,没有提到存储在AH寄存器中的值.如果它被初始化为零,它只适用于20以下的数字.现在我们假设它被初始化为零,我希望结果存储为AH = 1和AL = 5,但评论说"; …
我试图向自己解释以下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)