2010-06-15 2 views
1

Я довольно бесполезен, когда дело доходит до математики, и у меня есть проблема, с которой мне нужна помощь. Это не имеет никакого отношения к школьной работе, это на самом деле о alcatel и ticketextractor. У меня есть два значения, которые должны быть рассчитаны в переменном токе # приложения в соответствии с формулой, указанной в их документации:C# help help (TExtractor callid)

«Глобальный CallID равен: callid1, умноженных на 2 мощность 32 плюса callid2»

Как я сказал Я не большой с математикой, так что заявление ничего не говорит мне. Если кто-нибудь знает, как рассчитать это, я был бы признателен! Спасибо

+1

В заявлении указано gcallid = (callid1 * (2^32)) + callid2. Однако использование этого точного кода может вызвать проблемы на большинстве компьютеров из-за переполнения. Таким образом, используйте операторы сдвига в сочетании с большими переменными, такими как длинный или длинный, чтобы вычислить это значение. См., Например, сообщение Дэвида. – apoorv020

ответ

4

Прежде всего вам потребуется 64-битное значение для его хранения. Предполагая, что ваши значения callId (32-битные) ints, вам нужно будет сделать что-то вроде этого.

int callId1, callId2; 
... 
long globalCallId = ((long)callId1 << 32) + callId2; 

<< является оператором сдвига бит - 32 бита сдвига является эквивалентом умножения на 2^32.

+0

Спасибо, очень полезно. –

1

Проще всего перевести callid1 на 32 бита.

long globalCallId = ((long)callid1 << 32) + callid2; 
+0

Обратите внимание, что это будет работать только в том случае, если оба callid1 и callid2 являются longs. Явное кастинг в длину требуется, если они являются int. Вы должны быть осторожны с переполнениями при использовании операций сдвига. – apoorv020

+0

@ apoorv020: Здесь речь идет о расчетах, а не о типах. Кто сказал, что они не долго? Если вы предпочитаете, я его брошу. –

0

Так глобальное CallID = callid1 * 2 + callid2. Вы можете использовать:

long globalCallID = (callid1 << 32) + callid2 

Используется тот факт, что a << b == a multiplied by 2 to the power of b.

+0

Обратите внимание: это будет работать только в том случае, если оба callid1 и callid2 являются длинными. Явное кастинг в длину требуется, если они являются int. Вы должны быть осторожны с переполнениями при использовании операций сдвига. – apoorv020

+0

@ apoorv020: Пожалуйста, остановите downvoting все ответы, которые пропускают актерский состав. Вы не знаете, действительно ли это необходимо. –

+0

Может быть, я немного переусердствовал. Я извиняюсь. – apoorv020