这段代码中的& =是什么意思?

时间:2017-08-15 17:22:02

标签: c# pointers

我不理解以下代码中的*p++ &= 0xFF;。为什么运营商&=出现在这里?

unsafe void Foo(int[,] arr)
{
    int length = arr.Length;
    fixed (int* b = arr)
    {
        int* p = b;
        for (int i = 0; i < length; i++)
         *p++ &= 0xFF;
    }
}

6 个答案:

答案 0 :(得分:1)

这是另一个 assignment operator

x &= y

x = x & y  

在这种情况下,您正在递增p添加FF并分配给p

答案 1 :(得分:0)

所以你可能已经看过像a += b //a = a + b这样的东西了。

这与使用按位比较运算符&基本相同。具体来说,这里的用户以2的赞美形式获得p的反二进制值(我认为,有人纠正我)。

在此处查看按位比较的一个很好的示例,第一个答案:Understanding the behavior of a single ampersand operator (&) on integers

答案 2 :(得分:0)

它对数组的每个元素执行按位和操作。

例如,如果p [i] = 256,它将变为0;如果p [i] = -1,它将变为255;如果p [i] = -2,它将变为254。

 256: 00000001 0000000
0xFF: 00000000 1111111
======================
   0: 00000000 0000000

  -1: 11111111 1111111
0xFF: 00000000 1111111
======================
 255: 00000000 1111111

  -2: 11111111 1111110
0xFF: 00000000 1111111
======================
 254: 00000000 1111110

答案 3 :(得分:0)

通过执行AND按位运算,它将所有数组内容舍入到[0,255]范围内。

答案 4 :(得分:0)

// for example: we are passing array with 4 elements (arr[2,2])

unsafe static void Foo (int[,] arr)
{
    int length = arr.Length; // length == 4

    fixed (int* b = arr) // b is a pointer to the first element of the 'arr' array (pointer is of type int)
    {
        int* p = b; // lets copy pointer to a new variable (we will change that variable in a loop)
                    // we cannot change 'b', because it is a 'fixed' variable

        for (int i = 0; i < length; i++) // iterate over all 'arr' elements (4 elements)
            *p++ &= 0xFF; // *p = *p & 255   - it means we will use only 8 low bits from 32 bit int, all 'arr' values stay between [0..255]
                          // p = p + 4 (because int is 4 bytes)
                          // now p is a pointer to the second element in the 'arr' (each element in the arr is of size 4 bytes)

        // *p =   10101101 10101101 10101101 10101101
        // & 255  00000000 00000000 00000000 11111111
        // =      00000000 00000000 00000000 10101101
    }
}

答案 5 :(得分:0)

它们从数组中的每个项目获得最不重要的字节 * p ++获取p指向的值并将p设置为下一个地址 获得的值是32位整数

lhs&amp; = rhs相当于lhs = lhs&amp; RHS;

0xFFFF - 32位 0xFF - 16位

0xFFFF&amp; 0xFF == 0xFFFF&amp; 0x00FF

X&amp; 0为0,因此它们将前16位转换为零,仅获得最低有效位