我正在尝试将一些代码从C++移植到Java。代码在C++中如下所示:

  uint8_t r, g, b, bit, limit, *ptr;

  ...

  if(y < nRows) {
    // Data for the upper half of the display is stored in the lower bits of each byte.
    ptr = &matrixbuff[backindex][y * WIDTH * (nPlanes - 1) + x]; // Base addr
    // Plane 0 is a tricky case -- its data is spread about,
    // stored in least two bits not used by the other planes.
    ptr[WIDTH*2] &= ~B00000011;           // Plane 0 R,G mask out in one op
    if(r & 1) ptr[WIDTH*2] |=  B00000001; // Plane 0 R: 64 bytes ahead, bit 0
    if(g & 1) ptr[WIDTH*2] |=  B00000010; // Plane 0 G: 64 bytes ahead, bit 1
    if(b & 1) ptr[WIDTH]   |=  B00000001; // Plane 0 B: 32 bytes ahead, bit 0
    else      ptr[WIDTH]   &= ~B00000001; // Plane 0 B unset; mask out
    // The remaining three image planes are more normal-ish.
    // Data is stored in the high 6 bits so it can be quickly
    // copied to the DATAPORT register w/6 output lines.
    for(; bit < limit; bit <<= 1) {
      *ptr &= ~B00011100;            // Mask out R,G,B in one op
      if(r & bit) *ptr |= B00000100; // Plane N R: bit 2
      if(g & bit) *ptr |= B00001000; // Plane N G: bit 3
      if(b & bit) *ptr |= B00010000; // Plane N B: bit 4
      ptr  += WIDTH;                 // Advance to next bit plane
    }
  } else {
    // Data for the lower half of the display is stored in the upper
    // bits, except for the plane 0 stuff, using 2 least bits.
    ptr = &matrixbuff[backindex][(y - nRows) * WIDTH * (nPlanes - 1) + x];
    *ptr &= ~B00000011;                  // Plane 0 G,B mask out in one op
    if(r & 1)  ptr[WIDTH] |=  B00000010; // Plane 0 R: 32 bytes ahead, bit 1
    else       ptr[WIDTH] &= ~B00000010; // Plane 0 R unset; mask out
    if(g & 1) *ptr        |=  B00000001; // Plane 0 G: bit 0
    if(b & 1) *ptr        |=  B00000010; // Plane 0 B: bit 0
    for(; bit < limit; bit <<= 1) {
      *ptr &= ~B11100000;            // Mask out R,G,B in one op
      if(r & bit) *ptr |= B00100000; // Plane N R: bit 5
      if(g & bit) *ptr |= B01000000; // Plane N G: bit 6
      if(b & bit) *ptr |= B10000000; // Plane N B: bit 7
      ptr  += WIDTH;                 // Advance to next bit plane
    }
  }

我不了解ptr的用法

它声明为一个int:
uint8_t ... *ptr;
然后将其设置为某个值
ptr = &matrixbuff...
则似乎用作数组
ptr[WIDTH*2] &= ~B00000011;
什么?有人可以解释一下吗(然后在Java中是可能的)

最佳答案


与Java和其他许多从C派生语法的语言不同,C++使您可以在单个声明中声明不同类型的变量。尽管rgb等都是uint8_t,但ptr不是,因为带有星号前缀。该前缀使ptr成为uint8_t的指针。

同样,前缀提供了一个线索:这次是前缀运算符&,它接受后面的表达式的地址。

也是正确的,因为C++允许您像使用数组一样使用指针。在某些情况下,它也使您也可以将数组当作指针使用,但通常不应混淆这两个概念。
长话短说,如果您有一个类型为p的指针T*和一个整数值i,则表达式p[i]等效于*(p+i),并且在距离T所指向地址的i大小T偏移量处,引用了p类型的值。因此,指针的行为模仿了数组的行为。
在Java中,您必须将对ptr的操作转换为对matrixbuff的操作,其索引的计算方式是ptr上的索引和ptr本身的索引的组合,例如

ptr[WIDTH]
会成为
matrixbuff[backindex][y * WIDTH * (nPlanes - 1) + x + WIDTH]
//                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^
//                              Origin                Index

关于java - 此变量如何在cpp中用作int和数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43724654/

10-14 14:48