除非您真的想知道从一个字节到下一个字节传输的位是什么,否则我建议不要这样做!如果只是简单的数学运算,则将数组转换为实数 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
标志。