Преобразование кода Java C ++ - PullRequest
       11

Преобразование кода Java C ++

1 голос
/ 13 октября 2009

Мне нужно преобразовать этот код (в C ++) в код Java:

    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);
}

Ответы [ 5 ]

5 голосов
/ 13 октября 2009

Вы должны быть осторожны в Java с битовыми операциями. В Java нет неподписанных типов, поэтому вам, вероятно, понадобится на один размер больше размера, который вы использовали бы с беззнаковым разнообразием.

2 голосов
/ 13 октября 2009

Как уже говорили другие, увеличение размера m_table является решением. Тем не менее, вам нужно быть осторожным в кастинге, чтобы оставить его без подписи.

Просто делаю:

m_table[ i ] = (int)result;

... например, перенесет знаковый бит результата. Таким образом, если подписанный короткий результат равен -1, тогда m_table [i] будет иметь значение -1, когда вы действительно хотите 0xffff.

Исправьте это с помощью:

m_table[ i ] = result & 0xffff;

Это должно дать вам эквивалент оригинальной подписанной короткой позиции беззнакового короткого приведения ... сохранение его в int только для поддержания беззнаковой сущности.

1 голос
/ 13 октября 2009

Java выполняет целочисленные операции на int с или long с (если есть), поэтому вам нужно вернуть результаты к 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 заключается в наличии надежных диапазонов и поведения целочисленных типов. Используйте short, если вы имеете в виду 16 бит. Старшие 16 бит будут удалены, но осторожны при чтении до & 0xffff. Исходный код C (или «C ++») не является переносимым.

1 голос
/ 13 октября 2009

Является ли JVM байтовым порядком байтов? Что произойдет, если вы используете константы 0x0080 и 0x2110?

0 голосов
/ 14 октября 2009

Я полагаю, что у вас проблема со смещением влево ( << </strong>) 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;
    }
...