Java的C++代码转换
我需要把这段代码转换(在C++)成Java代码:Java的C++代码转换
short i;
short j;
short k;
short result;
unsigned short m_table[ 256 ]
for (i = 0 ; i < 256 ; i++)
{
k = i << 8;
result = 0;
for (j = 0 ; j < 8 ; j++)
{
if ((result^ k) & 0x8000)
result= (result<< 1)^0x1021;
else
result<<= 1;
k <<= 1;
}
m_table[ i ] = (unsigned short) result;
}
...但我从来没有得到相同的结果...
我的Java代码是:
int i;
int j;
int k;
int result;
int m_table[ 256 ] = new int[256];
for (i = 0 ; i < 256 ; i++) {
k = (i << 8);
result = 0;
for (j = 0 ; j < 8 ; j++) {
if (((result^ k) & 0x8000) != 0)
result= ((result<< 1)^0x1021);
else
result<<= 1;
k <<= 1;
}
m_table[ i ] = (result);
}
你需要小心Java的位操作。 Java没有任何未签名的类型,所以你可能需要使用比无符号类型更大的类型。
这是一个很好的观点。在这种情况下,'unsigned short'应该可以替换为'int'。除此之外,我认为C++是全部有效的Java。 – 2009-10-13 17:50:02
在JVM大端?如果使用常量0x0080和0x2110会发生什么?
讨论JVM的字节顺序:http://www.velocityreviews.com/forums/t548186-endianness-of-java-virtual-machine.html – 2009-10-13 17:52:37
@Thomas:简单的“是”或“否”就足够了。 ;) – jalf 2009-10-13 18:07:33
我认为讨论被连接而不是答案,因为在Java的情况下问题是一个加载的问题。 – 2009-10-13 18:17:24
Java在int
s或long
s(如果存在)上进行整数运算,因此您需要将结果计算回short
。也没有从整数到布尔值的自动转换。离开大括号是有点忌讳。所以:
if ((result^ k) & 0x8000)
result= (result<< 1)^0x1021;
else
result<<= 1;
应该改为:
if (((result^k) & 0x8000) == 0) {
result <<= 1;
} else {
result = (short)((result<<1)^0x1021);
}
的unsigned
从unsigned short
应该去(没有在Java中几乎无符号,虽然你可以使用char
)。 Java具有可靠范围和整数类型行为的优点。如果您的意思是16位,请坚持使用short
。前16位将读出& 0xffff
时被删除,但仔细。原始的C(或“C++”)代码不可移植。
正如其他人指出,正在增加m_table的尺寸的解决方案。但是,您需要在铸造时小心谨慎,以保持其不带符号。
简单地做:
m_table[ i ] = (int)result;
...例如,将结转结果的符号位。所以如果签名的短结果是-1,那么当你真正想要的是0xffff时,m_table [i]将以-1结束。
解决影响:
m_table[ i ] = result & 0xffff;
这应该给你签短,无符号短投原相当于...将其存储在一个int只是为了维持无符号的烦躁。
你有,我相信这个问题是左移(< <)int
值超出unsigned short
范围。为了解决问题,您需要将左移的结果屏蔽到范围内。要使用的掩码是0xFFFF。要记住的一点是,&
是一个非常低优先级运营商,所以括号(他们中的很多)是为了。 这是修改的例子。
final int m_table[ ] = new int[256];
for (int i = 0 ; i < 256 ; i++) {
// OK not to mask the result of << here, we are in unsigned short range
int k = (i << 8); // BTW, terrible name for this variable
int result = 0;
for (int j = 0 ; j < 8 ; j++) {
if (((result^ k) & 0x8000) != 0)
{
result= (((result<< 1) & 0xFFFF)^0x1021);
}
else
{
result <<= 1; // Change to 1-liner if you wish
result &= 0xFFFF; //
}
k <<= 1; // Change to 1-liner if you wish
k &= 0xFFFF; //
}
m_table[ i ] = result;
}
你目前的Java代码?你能粘贴吗? – 2009-10-13 17:43:51
你可能由以下事实得到位有作为Java中的无符号短没有这样的事情。 – Gandalf 2009-10-13 17:46:24
我怎样才能将短变成无符号短 – Arutha 2009-10-13 17:58:06