2012-06-03 3 views
1

Как преобразовать приведенный ниже фрагмент кода Java в C++. Я знаю, что могу написать typedef unsigned char byte, так что это позаботится, но я не понимаю, для чего предназначеныи <<=. И как один заменить finalПреобразование java-кода в C++

public static final long unsignedIntToLong(byte[] b) { 
      long l = 0; 
      l |= b[0] & 0xFF; 
      l <<= 8; 
      (l >>> 4) & 0x0F; 

Как проверить все это в C++ - есть некоторые модульные тесты я могу запустить, как я могу идти о конверсии.

+1

Этот код ничего не делает; нет заявления о возврате. –

+0

И | = и << = идентичны в Java и C++, а «final» в «static final long » ничего не делает. Здесь нет никаких вопросов. – EJP

+0

Этот код более или менее бесполезен в C++. C++ уже имеет встроенный 'unsigned int', поэтому нет необходимости использовать массив байтов. если у вас есть переменная 'unsigned int x;', и вам нужно преобразовать ее в 'long', вы просто выполните:' long y = (long) x; ', что намного проще. – Matt

ответ

5

Первое, |= - соединение побитовое ИЛИ. a |= b эквивалентен a = a | b, где каждый результирующий бит будет установлен, если установлен этот бит в a или b (или оба).

Вот таблица истинности, которая применяется к каждому биту:

a | b | result 
-------------- 
0 | 0 | 0 
0 | 1 | 1 
1 | 0 | 1 
1 | 1 | 1 

Во-вторых, <<= то же самое, но вместо побитового или, это немного сдвиг влево. Остальные биты ALl перемещаются влево на эту сумму, а справа заполняется 0 с.

101 << 1 == 1010 
110 << 2 == 11000 

final такое же, как C++ с помощью const определения переменной. Если, однако, вы хотите предотвратить переопределение функции, вы можете пометить final в конце заголовка функции, если функция также является виртуальной функцией (которую она должна была бы быть переопределена в первую очередь) , Однако это относится только к C++ 11. Вот что я имею в виду: example.

Наконец, >>> называется оператором unsigned right shift на Java. Обычно >> будет сдвигать биты, но оставить левый бит целым, чтобы сохранить знак числа. Иногда это может быть не так, как вы хотите. >>> будет постоянно помещать 0, вместо того, чтобы предполагать, что знак важен.

В C++, однако, signed - это актуальность, которая является частью типа переменной. Если переменная подписана, >> будет сдвигаться вправо, как это делает Java, но если переменная не определена, она будет действовать как оператор без сдвига вправо (>>>) на Java. Следовательно, C++ имеет только потребность в >>, так как он может вывести, что делать.

+3

'final' - это не то же самое, что' const' в этом контексте. –

+0

+1, вы не можете ограничить возможности классов C++ каким-либо образом. –

+0

@ OliCharlesworth, ой, я этого не замечал. Я еще немного застрял на двух других. Спасибо, что указали это. – chris

3

| = то же самое на обоих языках: побитовое ИЛИ применяется к переменной lhs, точно так же, как + =. То же самое с < < =; это сдвиг бит слева оператора.

Беззнаковый длинный может быть сложным; нет такой вещи в Java.

Есть CppUnit. Попробуйте использовать это.

+0

спасибо. и я проверю CppUnit. – user1155299

0

Нет прямого ответа на вопрос о том, как написать окончательный класс на C++. Однако Google покажет вам много примеров. Например, частный constuctor или класс frend.

| является оператором OR. Так, например, 0x10 | 0x10 = 0x11.

< < - оператор с битрейтом. Так, например, 0b1 < < 0b1 = 0b10, 10 < < 2 = 0b1000 и так далее. Сдвиг на 1 умножает ваше значение на 2.

Например:

class Converter{ 
public: 
    static Converter * createInstance() 
    { 
     return new Converter; 
    } 

    long unsignedIntToLong(unsigned char *b){ 
     long l = 0; 
     l |= b[0] & 0xFF; 
     l <<= 8; 
     //.. 
     return l; 
    } 
private: 
    Converter(){ 

    } 
}; 
+0

Здесь нет класса 'final'. –

+0

@ OliCharlesworth, возможно, вы можете показать пример кода, как будет работать 'final'. Мой код не завершен, поскольку я все еще пытаюсь понять, что делают разные части. Этот код предназначен для декодирования фида данных, который не находится в формате ASCII – user1155299

Смежные вопросы