我正在使用字节数组(大小为2或4)来模拟short
和int
数据类型的效果。
主要思想是拥有支持char
和int
类型的数据类型,但是我很难以这种方式模拟算术运算,因为我必须在位级别执行它们。
对于那些不遵循的人:
123的int
表示不等于{0,1,2,3}的字节[],因为它们的位表示不同(123表示为00000000000000000000000001111011
且表示为{0 ,1,2,3}在我的系统上是00000000000000010000001000000011
。
所以“int
123”实际上相当于“{0,0,0,123}的byte[]
”。当值延伸到几个字节并且我尝试从那些字节数组中减去或减少时会出现问题,因为那时你必须与几个不同的字节进行交互,而我的数学并不那么尖锐。
欢迎任何伪代码或java库建议。
答案 0 :(得分:1)
除非你真的想知道从一个字节到下一个字节的位数,我建议不要这样做!如果它只是简单的数学运算,那么将数组转换为真正的 short
和int
类型,进行数学计算,然后再将它们转换回来。
如果您必须这样做,请考虑以下事项:
想象您正在添加short
数组中的两个byte
变量。
您遇到的第一个问题是所有Java整数类型都是签名。
第二个是从最低有效字节到最高有效字节的“进位”最好使用更长而不是byte
的类型来完成,因为否则你无法检测到溢出。
即。如果你添加两个8位值,进位将在第8位。但是byte
只有位0..7
,所以要计算位8,你必须将你的字节提升到下一个适当的更大的类型,执行添加操作,然后确定是否导致进位,然后在添加MSB时处理。这不值得。
例如,添加两个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
标志。