除非您真的想知道从一个字节到下一个字节传输的位是什么,否则我建议不要这样做!如果只是简单的数学运算,则将数组转换为实数 short和int类型,进行数学运算,然后再次将它们转换回来。
如果您必须这样做,请考虑以下事项:
成像您正在添加两个数组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不同的加法,以提取,v和c标志。