Побитовая операция на длинных - PullRequest
4 голосов
/ 29 марта 2012

Я пытаюсь скомпилировать этот код:

Int64 itag = BitConverter.ToInt64(temp, 0);
itag &= 0xFFFFFFFFFFFFFC00;

Однако это дает мне следующую ошибку:

Оператор '& =' нельзя применять к операндам типа 'long' и 'ulong'

Как мне это сделать?

Ответы [ 6 ]

5 голосов
/ 29 марта 2012

См. http://msdn.microsoft.com/en-en/library/aa664674%28v=vs.71%29.aspx.

Если литерал не имеет суффикса, он имеет первый из этих типов, в котором его значение может быть представлено: int, uint, long, ulong.

У вас есть

0xFFFFFFFFFFFFFC00

, но Int64.Max:

0x7FFFFFFFFFFFFFFF

так что long недостаточно велик, и ulong принимается за тип литерала.

Теперь у вас есть Int64, который подписан, а с правой стороны - ulong, однако нет перегрузки &=, которая принимает эту комбинацию, что приводит к ошибке .

3 голосов
/ 29 марта 2012

C # использует наименьший тип подгонки для целочисленных литералов, а 0xFFFFFFFFFFFFFC00 слишком велик для длинных, поэтому это ulong.

Так что либо преобразуйте itag в ulong, либо 0xFFFFFFFFFFFFFC00 в long (не проверено).

1 голос
/ 29 марта 2012

Раздел 7.11.1 Целочисленные логические операторы Спецификации языка C # гласит:

Предопределенные целочисленные логические операторы:

int operator & (intx, int y);

оператор uint & (uint x, uint y);

оператор long & (long x, long y);

оператор ulong & (ulong x, ulong y);

Как видите, между long (который является просто псевдонимом для Int64) и ulong нет предопределенного оператора, отсюда и ошибка.

1 голос
/ 29 марта 2012

itag длинный. 0xFFFFFFFFFFFFFC00 это улонг. Вы пытаетесь смешать оба в выражении &=, которое не работает.

Почему ваш литерал улонг? MSDN говорит :

Если у литерала нет суффикса, он имеет первый из этих типов, в котором его значение может быть представлено: int, uint, long, ulong.

Поскольку число слишком велико для int, uint или long, ваш литерал становится ulong.

У вас есть два варианта: либо объявить itag как ulong, как предлагали другие, либо (поразрядно) преобразовать ваш литерал в long:

itag &= unchecked((long)0xFFFFFFFFFFFFFC00);

Это превратит ваш ulong в (отрицательный) long.

1 голос
/ 29 марта 2012

«Числа» со знаком и без знака не могут быть совмещены, а Int64 подписан, так что это нельзя.

Я бы пошел так:

UInt64 itag = BitConverter.ToUInt64(temp, 0); //note the added 'U' to make it unsigned
itag &= 0xFFFFFFFFFFFFFC00; //Now types match, they're both unsigned.
0 голосов
/ 29 марта 2012

Проблема в том, что вы пытаетесь &= a long и ulong.

Просто заменить Int64 на ulong, чтобы решитьпроблема, потому что тогда вы применяете &= к 2 ulong с.

...