2012-05-01 3 views
2

Возможные Дублировать:
What is >>> operation in C++'>>>' Java на C++

Мне нужно преобразовать эту крохотную часть Java на C + +, но не знаю, что это «>>>» ... искал, но не нашел ссылок, только на смену. У кого-нибудь есть идеи?

int x1; 

x1 = text1[i1++] & 0xff; 

text2[i2++] = (char) (x1 >>> 8); 
+0

Это * без знака * оператор сдвига вправо. Я действительно не уверен, что эквивалент C++ ... – Ryan

ответ

3

Незнакомая сдвиг вправо (>>>) не существует в C++, потому что это необязательно - C++ имеет разные типы подписей и без знака. Если вы хотите, правые сдвиги быть без знака, сделать переменную, которая сдвигается без знака:

unsigned int x1 = text1[i1++] & 0xff; 
text2[i2++] = (char) (x1 >> 8); 

Это, как говорится, код вы переводите глупо. В результате второй операции всегда будет равна нулю в Java, так что вы можете так же легко перевести его на:

i1++; 
text2[i2++] = 0; 
+0

Я уверен, что это неверно: актер не магически влияет на «контекст» выражения, к которому он применяется. – duskwuff

+0

Это действительно был дубликат, Мое извинение. Правильный путь: text2 [i2 + +] = (char) (без знака int) (x1 >> 8); или text2 [i2 + +] = (char) ((unsigned int) x1 >> 8); –

+0

К сожалению, я пропустил преобразование в unsigned перед сменой. Мои извинения. –

0

эквивалент в C будет:

unsigned int x1; 

x1 = text1[i1++] & 0xff; 

text2[i2++] = (unsigned char)(x1 >> 8) 

В C оператор сдвига будет тянуться 1 из знакового бита над если переменная она работает на подписывается, если не будет действовать как java unsigned shift.

0

>>> оператор в Java является logical shift эквивалентно >> оператора в C++ на unsigned типов. Он сдвигает нули в свободные позиции бит слева. На подписанных типах, это определяется реализация ли сдвиг вправо является логическим или arithmetic, поэтому вам нужно использовать беззнаковый тип с самого начала (или гипса):

unsigned int x1; 
x1 = text1[i1++] & 0xff; 
text2[i2++] = static_cast<char>(x1 >> 8); 

Конечно, этот код не кажется, сделать очень много смысла - x1 имеет только 8 ненулевых битов, потому что он был замаскирован 0xff, поэтому смещение вправо на 8 бит приводит к нулю.