Java - 位级别的字节数组算术?

时间:2013-03-28 14:28:21

标签: java math bytearray bits

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

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

所以“int 123”实际上相当于“{0,0,0,123}的byte[]”。当值延伸到几个字节并且我尝试从那些字节数组中减去或减少时会出现问题,因为那时你必须与几个不同的字节进行交互,而我的数学并不那么尖锐。

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

1 个答案:

答案 0 :(得分:1)

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

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

想象您正在添加short数组中的两个byte变量。

您遇到的第一个问题是所有Java整数类型都是签名

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

即。如果你添加两个8位值,进位将在第8位。但是byte只有位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;
}

要求在操作数的不同变体上完成三个不同的添加,只是为了提取hvc标志。