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