Java 按位异或运算符和字节数组

Java 按位异或运算符和字节数组,java,arrays,bitwise-operators,bitwise-xor,Java,Arrays,Bitwise Operators,Bitwise Xor,我有以下代码: byte[] S = new byte[256]; byte[] T = new byte[256]; for (int i = 0; i < 256; ++i) { S[i] = (byte)i; T[i] = 13; } int j = 0; int i2 = 0; while (i2 < 256) { j = j + S[i2] + T[i2] & 255; byte[] arrby = S; int n2 =

我有以下代码:

byte[] S = new byte[256];
byte[] T = new byte[256];

for (int i = 0; i < 256; ++i) {
    S[i] = (byte)i;
    T[i] = 13;
}

int j = 0;
int i2 = 0;
while (i2 < 256) {
    j = j + S[i2] + T[i2] & 255;
    byte[] arrby = S;
    int n2 = i2;
    arrby[n2] = (byte)(arrby[n2] ^ S[j]);
    byte[] arrby2 = S;
    int n3 = j;
    arrby2[n3] = (byte)(arrby2[n3] ^ S[i2]);
    byte[] arrby3 = S;
    int n4 = i2++;
    arrby3[n4] = (byte)(arrby3[n4] ^ S[j]);
}
S[0]将其值从“0”更改为“13”,我不明白为什么。 什么是修改S[0]值?在我看来,“^”只是在进行比较,并改变arrby[n2]的值,而不是S[0]

这里:

byte[] arrby = S;
您正在使
arrby
指向与S相同的数组

然后:

您正在更改该数组中的一个条目

塔达


因此,解决方案是:如果不想修改数组的内容,请确保不创建指向该数组的其他引用。根据您的要求,例如,您可以将数据从S复制到新创建的
arrby
数组中。

下面的代码行使
arrby
引用与
S
相同的分配内存

byte[] arrby = S;

byte[]arrby=S
-
S
arrby
指的是同一个数组。除此之外:你的名字有点可怕。他们没有说变量是关于什么的。在所有地方“拼写”数组的长度(255)也是非常可怕的。最好使用array.length,或者至少使用某个常数=255。
byte[]arrby=S
-这不会创建
S
的副本并将其存储到
arrby
。它复制引用,这意味着两个变量将引用同一个对象。如果您修改
arrby
,您也将修改
S
,反之亦然。
arrby[n2] = (byte)(arrby[n2] ^ S[j]);
byte[] arrby = S;