对这个看似微不足道的问题道歉,但我似乎无法在任何地方找到答案 - 我只是想在我的Z80仿真器中实现DAA指令,我在Zilog手册中注意到它是为了调整的目的用于二进制编码的十进制算术的累加器.它表示该指令旨在在加法或减法指令之后运行.
我的问题是:
我知道如果你不懂二进制文件,BCD就像更直观的数据类型.但我不知道为什么要使用这种编码,因为它在4位中的浪费表示(当表示大于9时)并没有多大意义.
另外我认为x86只支持add和subs(你可以通过FPU转换它们).
它可能来自旧机器或其他架构?
谢谢!
二进制字段的描述是:
呼叫者号码,用压缩的BCD码表示,剩余比特用"0xF"填充
我试图用struct格式打印,'16c'然后得到:('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff')如果我使用'16b'我得到(51, 0, 2, 5, 21, 19, 71, 79, -1, -1, -1, -1, -1, -1, -1, -1).这是不正确的,我应该得到电话号码,上面的数字是无效的.
print struct.unpack_from('>16b', str(data.read()),offset=46)
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用,我得到无效的数字.我应该以什么格式解压缩16字节字段以及如何转换BCD代码?
我正在编写一个例程,用于在BCD(每位十进制4位)和密集包装十进制(DPD)(每3位十进制数位10位)之间进行转换.在Mike Cowlishaw的网站上进一步记录了DPD(建议软件使用查找表).
这个例程只需要它使用的低16位寄存器,但对于较短的指令编码,我尽可能使用32位指令.与代码相关的速度惩罚如下:
mov data,%eax # high 16 bit of data are cleared
...
shl %al
shr %eax
Run Code Online (Sandbox Code Playgroud)
要么
and $0x888,%edi # = 0000 a000 e000 i000
imul $0x0490,%di # = aei0 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)
其中16位的替代方案imul是32位imul,后续and或一系列lea指令和最终指令and.
我的例程中的整个代码可以在下面找到.由于我混合使用单词和双字指令,其中的表现是否有任何可能性更差?
.section .text
.type bcd2dpd_mul,@function
.globl bcd2dpd_mul
# convert BCD to DPD with multiplication tricks
# input abcd efgh iklm in edi
.align 8
bcd2dpd_mul:
mov %edi,%eax # …Run Code Online (Sandbox Code Playgroud) 我正在寻找Delphi Data.FmtBcd库的替代品,因为我只是达到它可以表示的最大十进制数字的限制,并且程序终止于EBcdOverflowException.对于好奇,我正在计算算术系列成员,需要处理非常大的数字 - 数十万个位置并不是那么罕见.并在合理的时间内获得结果.我确实将部分代码重写为Python 3.2用于测试目的,并且计算速度足以满足Delphi的要求.
有关此类库的一些建议,最好是免费还是开源?
我知道你可以使用这个表将十进制转换为BCD:
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
是否存在此转换的等式或您只需使用该表?我试图为这个转换写一些代码,但我不知道如何为它做数学.建议?
我的项目中使用的值用4位二进制编码的小数(BCD)表示,它最初存储在字符缓冲区中(例如,由指针指向const unsigned char *).我想将输入BCD字符流转换为整数.你能告诉我一个有效而快速的方法吗?
数据格式示例和预期结果:
BCD*2; 1001 0111 0110 0101=9765
"9" "7" "6" "5"
Run Code Online (Sandbox Code Playgroud)
非常感谢你!
我想使用BCD将int转换为byte [4]数组.
有问题的int将来自设备ID,他需要通过serialport与设备通话.
是否有任何预制功能可以做到这一点,或者你能给我一个简单的方法吗?
例:
int id= 29068082
Run Code Online (Sandbox Code Playgroud)
输出:
byte[4]{0x82, 0x80, 0x06, 0x29};
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个限制性环境,其中允许的唯一类型是:
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,这将是有用的.