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

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

Что я делаю не так? Я пытаюсь найти, из каких масок состоит целое число, если это имеет смысл.

e.g.

63 = 1+2+4+8+16+32

unsafe
{
    UInt64 n = Convert.ToUInt64(textAttributes.Text);
    UInt64* p = &n;
    for(UInt64 i = 1; i <= n; i <<= 1) 
    {
        if (i & p) 
        {
            switch(i)
            {
                default:
                    break;
            }
        }
    }
}

person user3685954    schedule 29.05.2014    source источник
comment
Вы имеете в виду i & n != 0? Я не понимаю, насколько нужен небезопасный код.   -  person Mike Zboray    schedule 29.05.2014
comment
@JeroenVannevel Обратите внимание на звездочку в ошибке.   -  person Simon Whitehead    schedule 29.05.2014
comment
Связанный пост здесь.   -  person RBT    schedule 22.08.2017


Ответы (3)


Для этого вам не нужен небезопасный код.

Ошибка компилятора допустима, поскольку вы применяете оператор & между указателем и целым числом.

Вы, вероятно, хотите:

    UInt64 n = 63;
    for(int i = 0; i < 64; i++) 
    {
        UInt64 j = ((UInt64) 1) << i;
        if ((j & n) != 0) 
        {
          Console.WriteLine(1 << i);
        }
    }
person quantdev    schedule 29.05.2014
comment
Оператор «‹‹» нельзя применять к операндам типа «int» и «ulong». - person user3685954; 29.05.2014
comment
Просто дает мне 0, 1, 2, 3, 4, 5 Но я думаю, что это даже лучше. Благодарю вас! - person user3685954; 29.05.2014
comment
отредактировано для ожидаемого результата (я заменил WriteLine(i) на WriteLine(1 ‹‹ i) - person quantdev; 29.05.2014
comment
Большое спасибо! Я застрял на этой проблеме в течение нескольких часов ›.‹ - person user3685954; 29.05.2014

То, что вы пытаетесь сделать, это побитовое И против адреса памяти. Вам нужно разыменовать этот указатель, если вы хотите что-то с ним сделать:

if ((i & *p) != 0)
//       ^^ dereference

Разыменование с помощью префикса звездочки извлечет значение по этому адресу памяти. Без него.. сам адрес памяти 1

1. В C# это ошибка компилятора. Но это так.

person Simon Whitehead    schedule 29.05.2014
comment
Это помогло, спасибо. Как я могу сделать это, не используя unsafe? - person user3685954; 29.05.2014

Ну, вам не нужен небезопасный контекст для такой операции

Попробуй это :

static void Main(string[] args)
{
    UInt64 n = Convert.ToUInt64(63);

    int size = Marshal.SizeOf(n) * 8;
    for (int i = size - 1; i >= 0; i--)
    {
        Console.Write((n >> i) & 1);
    }
}

Это напечатает 0000000000000000000000000000000000000000000000000000000000111111, чтобы вы знали, какой бит установлен!

person Parimal Raj    schedule 29.05.2014
comment
Я как бы пытаюсь избежать этого. Спасибо хоть. - person user3685954; 29.05.2014