Java中的拆分数组单元

时间:2012-03-19 08:38:35

标签: java c

outp是unsigned short *类型。根据模式是全局变量的模式,需要进行一些操作。在if-block中,val被分配给计算出的索引。在if-else中首先计算outc指向的地址,然后在位置分配值,这反过来导致outp 的特定单元格发生变化。

void lds_ld(int val, int x, int y, int value, unsigned short* outp)
{
    unsigned char *outc;
    if(mode==1)
    {
           outp[y*width +x] = val;
    }
    else if (mode==2)
    {
           outc = (unsigned char *)outp +y*width + x;
           *outc= value;
    }
    else
    {
           printf("Wrong mode");
    }
}

我需要编写一个执行相同功能的java代码。所以我写了:

void lds_ld(int val, int x, int y, int value, int outp[])
{
    short outc[];
    if(mode==1)
    {
           outp[y*width +x] = val;
    }
    else if (mode==2)
    {
           //what to write here
    }
    else
    {
           System.out.printf("Wrong mode");
    }
}

要编写if-else块,我需要先将每个数组单元拆分成两个,然后计算索引并在该索引处赋值,然后将此数组转换回int []类型。整体我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

java中没有指针,因此您可以处理同一个数组并记住索引从中开始或创建新数组并将源数组的一部分复制到目标:

// check array size calculations: I am not sure I completely 
// your logic but I am sure you do.
int outc = new int[outp - (y*width + x)]; understand 
System.arraycopy(outp, y*width + x, outc, 0, outc.length);

答案 1 :(得分:1)

模式2似乎只允许你编辑短片的第一个字节,所以你可以试试这个:

int arrayValue = outp[y * width + x];
int firstByte = (arrayValue >> 8) & 0xFF;
int secondByte = arrayValue & 0xFF;

firstByte = value;
//if you want to edit the second byte:
//secondByte = value;

outp[y * width + x] = (int)(firstByte << 8) + secondByte;

答案 2 :(得分:1)

根据width的设置方式,您

1)从int

设置两个短路

2)或者你设置一个短的一半,另一个短,以及另一半短的int。你正在改变哪些短路(最多或最不重要)将取决于你的CPU架构(也许你的编译器)

由于(2)非常痛苦,让我们假设(1),即宽度%2 == 0.在Java中,你必须自己拆分int而不是假设施放魔法:

 // determine the least significant 16 bits of your int
short lower = (short)(value & 0xffff);
 // determine the most significant 16 bits of your int
short upper = (short)(value >>> 16);
// same calculation as in C-code, but for a short-array instead of for char-array
int pos = (y * width + x) / 2;
// assuming little endian order in your array (similar to running the C-code on x86
outp[pos] = lower;
outp[pos + 1] = upper;

对于选项(2),您需要将int拆分为三个值:

byte left = (byte)(value & 0xff);
short middle = (short)(value >>> 8);
byte right = (byte)(value >> 24);

执行此操作后,您可以将middle直接分配给outp[pos],但必须使用位操作操作将左右字节与单元格中的现有值组合使用:

if ((y * width + x) % 2) != 0) {
  // still assuming little endianness
  outp[pos - 1] = (short)(outp[pos - 1] & 0xff00 | left);
  outp[pos + 1] = (short)(((right << 8) & 0xff00) | (outp[pos + 1] & 0xff));
}

答案 3 :(得分:0)

执行给定任务的另一种方法是使用java.nio.ByteBuffer类:

import java.nio.*;
// Wrap outp into a ByteBuffer

ByteBuffer outpBuf = ByteBuffer.wrap(outp);
outpBuf.putInt(y * width + x, value);

请注意,ByteBuffer最初使用Big Endian排序,因此您需要使用outpBuf.order(ByteOrder.LITTLE_ENDIAN)来获得与其他海报建议的直接位操作相同的结果。