运营商'
&
'不能应用于'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;
}
}
}
}
答案 0 :(得分:2)
你不需要不安全的代码。
编译器错误是合法的,因为您应用了运算符&amp;在指针和整数之间
你可能想要:
UInt64 n = 63;
for(int i = 0; i < 64; i++)
{
UInt64 j = ((UInt64) 1) << i;
if ((j & n) != 0)
{
Console.WriteLine(1 << i);
}
}
答案 1 :(得分:0)
您尝试做的是对存储器地址进行按位AND。如果你想对它做任何事情,你需要取消引用该指针:
if ((i & *p) != 0)
// ^^ dereference
通过星号前缀取消引用将检索该内存地址的值。没有它..它的内存地址本身 1
1。在C#中,这是编译器错误。但事实就是如此。
答案 2 :(得分:0)
你不需要这种操作的不安全上下文
试试这个:
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
,以便您知道设置了哪个位!