Оператор '&' не может быть применен к операндам типа 'ulong' и 'ulong*'

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

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

например

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;
            }
        }
    }
}

3 ответа

Решение

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

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

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

    UInt64 n = 63;
    for(int i = 0; i < 64; i++) 
    {
        UInt64 j = ((UInt64) 1) << i;
        if ((j & n) != 0) 
        {
          Console.WriteLine(1 << i);
        }
    }

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

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

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

1. В C# это ошибка компилятора. Но это то, что есть.

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

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

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 так что вы будете знать, какой бит установлен!

Другие вопросы по тегам