【问题标题】:Bitwise XOR operator and byte arrays按位异或运算符和字节数组
【发布时间】:2017-02-07 13:45:57
【问题描述】:

我有以下代码:

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,1,2,3,4,5...

当程序到达该行时:

arrby[n2] = (byte)(arrby[n2] ^ S[j]);

S[0] 将其值从“0”更改为“13”,我不明白为什么。 什么在修改 S[0] 值?正如我所看到的,'^' 只是进行比较并更改 arrby[n2] 的值而不是 S[0]

【问题讨论】:

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

标签: java arrays bitwise-operators bitwise-xor


【解决方案1】:

这里:

byte[] arrby = S;

你正在使arrby point 指向 same 数组作为 S。

然后:

arrby[n2] = (byte)(arrby[n2] ^ S[j]);

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

多田...

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

【讨论】:

    【解决方案2】:

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

    byte[] arrby = S;
    

    【讨论】:

      猜你喜欢
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多