0

我正在使用字节数组(大小为 2 或 4)来模拟shortint数据类型的效果。主要思想是拥有一个同时支持charint类型的数据类型,但是我真的很难以这种方式模拟算术运算,因为我必须在位级别进行运算。对于那些不遵守的人:

123的int表示不等于 {0,1,2,3} 的 byte[],因为它们的位表示不同(123 表示是00000000000000000000000001111011,而 {0,1,2,3} 的表示00000000000000010000001000000011在我的系统上。

所以“ intof 123”实际上等同于“ byte[]of {0,0,0,123}”。当值跨越几个字节并且我尝试从这些字节数组中减去或减少时,就会出现问题,因为那时你必须与几个不同的字节进行交互,而我的数学并不那么清晰。

欢迎任何伪代码或 java 库建议。

4

1 回答 1

1

除非您真的想知道从一个字节到下一个字节传输的位是什么,否则我建议要这样做!如果只是简单的数学运算,则将数组转换为实数 shortint类型,进行数学运算,然后再次将它们转换回来。

如果您必须这样做,请考虑以下事项:

成像您正在添加两个数组short中的变量byte

您遇到的第一个问题是所有 Java 整数类型都是有符号的。

第二个是从最低有效字节到最高有效字节的“进位”最好使用比 a更长byte的类型,因为否则您无法检测到溢出。

即如果你添加两个 8 位值,进位将在第 8 位。但是 abyte只有 bits 0..7,所以要计算第 8 位,你必须将你的字节提升到下一个适当的更大类型,做加法操作,然后弄清楚如果它导致进位,然后在添加 MSB 时处理。这不值得。

顺便说一句,很多年前,当我写一个 MC6809 CPU 仿真器时,我确实不得不做这种位操作。当硬件 ALU“免费”生成相同的位时,必须对相同的操作数执行多个操作,以便能够弄清楚对 CPU 的各种状态位的影响。

例如,我添加两个 8 位寄存器的 (C++) 代码如下所示:

void mc6809::help_adc(Byte& x)
{
    Byte    m = fetch_operand();

    {
        Byte    t = (x & 0x0f) + (m & 0x0f) + cc.bit.c;
        cc.bit.h = btst(t, 4);          // Half carry
    }

    {
        Byte    t = (x & 0x7f) + (m & 0x7f) + cc.bit.c;
        cc.bit.v = btst(t, 7);          // Bit 7 carry in
    }

    {
        Word    t = x + m + cc.bit.c;
        cc.bit.c = btst(t, 8);          // Bit 7 carry out
        x = t & 0xff;
    }

    cc.bit.v ^= cc.bit.c;
    cc.bit.n = btst(x, 7);
    cc.bit.z = !x;
}

这需要对操作数的不同变体进行三个h不同的加法,以提取,vc标志。

于 2013-03-28T14:36:03.183 回答