0

运算符“ &”不能应用于“ 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;
            }
        }
    }
}
4

3 回答 3

2

你不需要不安全的代码。

编译器错误是合法的,因为您在指针和整数之间应用了运算符 &

你可能想要:

    UInt64 n = 63;
    for(int i = 0; i < 64; i++) 
    {
        UInt64 j = ((UInt64) 1) << i;
        if ((j & n) != 0) 
        {
          Console.WriteLine(1 << i);
        }
    }
于 2014-05-29T03:48:09.517 回答
0

您正在尝试做的是针对内存地址的按位与。如果你想对它做任何事情,你需要取消引用该指针:

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

通过星号前缀取消引用将检索该内存地址处的值。没有它..它的内存地址本身1

1. 在 C# 中是编译器错误。但事实就是如此。

于 2014-05-29T03:44:20.290 回答
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,因此您将知道设置了哪些位!

于 2014-05-29T03:58:14.260 回答