运营商'&'不能应用于'ulong'类型的操作数和' ulong *'

时间:2014-05-29 03:33:25

标签: c# unsafe 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;
            }
        }
    }
}

3 个答案:

答案 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,以便您知道设置了哪个位!