我不理解以下代码中的*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;
}
}
答案 0 :(得分:1)
答案 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位转换为零,仅获得最低有效位