java - 嵌入式 Java 中的二进制编码十进制数学

标签 java embedded bcd

我想使用字节数组(BCD 格式)表示的小数来对字节数组形式的十进制值执行数学增量。

举个例子,我想在数学中进行255 + 1,得到256。以二进制数组格式完成时,255 值为 00000000FF1 为十六进制表示的 0000000001 值字节数。预期结果为 0000000100

我的以下代码尝试将 255 的 5 字节数组增加 1。我的最终结果是 00000001FE,最后一个字节 0xFE 应该是 0x00。如何更正我的算法,以便仅使用基本二进制操作数(嵌入了 Java 环境)来正确执行 5 字节数组增量?

    private static byte[] clkCtrCurr = new byte[5];
    private static byte[] inc = {0x00, 0x00, 0x00, 0x00, 0x01};
    private static byte buff;
    private static byte carry;

    public static void binAdd() {
        buff = (byte) (clkCtrCurr[4] ^ inc[4]);
        carry = (byte) (clkCtrCurr[4] & inc[4]);
        clkCtrCurr[4] = buff;
        clkCtrCurr[3] ^= carry;
        buff = (byte) (clkCtrCurr[3] ^ inc[3]);
        carry = (byte) (clkCtrCurr[3] & inc[3]);
        clkCtrCurr[3] = buff;
        clkCtrCurr[2] ^= carry;
        buff = (byte) (clkCtrCurr[2] ^ inc[2]);
        carry = (byte) (clkCtrCurr[2] & inc[2]);
        clkCtrCurr[2] = buff;
        clkCtrCurr[1] ^= carry;
        buff = (byte) (clkCtrCurr[1] ^ inc[1]);
        carry = (byte) (clkCtrCurr[1] & inc[1]);
        clkCtrCurr[1] = buff;
        clkCtrCurr[0] ^= carry;
        clkCtrCurr[0] ^= inc[0];
    }

最佳答案

BCD format表示每个十进制数字 (0-9) 存储在 4 位中(如果解压缩则为 8 位),这意味着该数字在以十六进制打印时看起来是十进制的。

示例:十进制数 123 应以 BCD 格式存储为 0x0123(十进制 291)。

如果解压,它只是 3 个字节:0x01 0x02 0x030x010203(十进制 66051)。

因此,如果您想要一个 5 字节打包的大端 BCD 数字,即 10 位十进制数字,并且您想要递增,您可以这样做:

private static void increment(byte[] bcd) {
    for (int i = bcd.length - 1; i >= 0; i--) {
        byte b = bcd[i];
        if ((b & 0x0F) < 0x09) {
            bcd[i] = (byte)(b + 1);
            return;
        }
        if ((b & 0xF0) < 0x90) {
            bcd[i] = (byte)((b & 0xF0) + 0x10);
            return;
        }
        bcd[i] = 0;
    }
}

测试

private static void print(byte[] bcd) {
    for (int i = 0; i < bcd.length; i++) {
        if (i != 0)
            System.out.print(' ');
        System.out.printf("%02x", bcd[i]);
    }
    System.out.println();
}
public static void main(String[] args) {
    byte[] bcd1 = { 0x00, 0x00, 0x00, 0x01, 0x23 }; // decimal 123
    for (int i = 0; i < 10; i++) {
        increment(bcd1);
        print(bcd1);
    }
    byte[] bcd2 = { (byte)0x99, (byte)0x99, (byte)0x99, (byte)0x99, (byte)0x95 }; // decimal 9_999_999_995
    for (int i = 0; i < 10; i++) {
        increment(bcd2);
        print(bcd2);
    }
}

输出

00 00 00 01 24
00 00 00 01 25
00 00 00 01 26
00 00 00 01 27
00 00 00 01 28
00 00 00 01 29
00 00 00 01 30
00 00 00 01 31
00 00 00 01 32
00 00 00 01 33
99 99 99 99 96
99 99 99 99 97
99 99 99 99 98
99 99 99 99 99
00 00 00 00 00
00 00 00 00 01
00 00 00 00 02
00 00 00 00 03
00 00 00 00 04
00 00 00 00 05

关于java - 嵌入式 Java 中的二进制编码十进制数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34388376/

相关文章:

java - 仅存在于子类中的属性的别名(Hibernate Criteria)

java - 使用 Java 8 过滤结果集的多个条件

java - 如何在 HashSet 中只维护不相等的对象

c - 构建时删除并写入闪存会出错

c - 调试器对嵌入式应用程序的影响

linux - 所有任务的单一公共(public)地址空间

java - ByteArrayOutputStream 的数字字符串

java - 错误 : "schemaLocation value *** must have even number of URI' s. “在 Spring 调度程序中的命名空间上

c - BCD 中的位移位

C++从char数组到BCD