锯齿数组gMul移位结果不符合预期的技术问题
问题分析与修复:锯齿数组移位后结果不符合预期
我来帮你排查问题所在并修复代码!你的问题主要有两个核心原因:数组引用共享和移位逻辑错误,咱们一步步来解决:
为什么会出现gMul[3]和gMul[2]相同的情况?
你的shift函数犯了一个常见的错误:它直接修改了传入的原数组,并且返回的是原数组的引用,而不是创建一个新数组。
在循环中:
- 当
i=1时,shift(gMul[0])修改了gMul[0]本身,然后gMul[1] = shifted让它和gMul[0]指向同一个数组 - 当
i=2时,shift(gMul[1])还是在修改同一个数组,gMul[2]也指向这个数组 - 同理,
i=3时依然操作的是同一个数组对象
最终gMul的所有元素都共享同一个数组引用,所以看起来多个位置的结果都一样。
你的移位逻辑也不符合预期
除了引用问题,你原始的shift函数逻辑并没有实现你想要的循环右移效果。根据你的预期,我们需要实现循环右移一位的逻辑:把数组最后一个元素移到第一位,其余元素依次向后移动一位。
修复后的完整代码
修正后的shift函数(创建新数组,实现正确移位)
public byte[] shift(byte[] row) { int length = row.Length; byte[] newRow = new byte[length]; // 循环右移一位:最后一个元素放到首位,其余元素依次后移 newRow[0] = row[length - 1]; for (int i = 1; i < length; i++) { newRow[i] = row[i - 1]; } return newRow; }
保持不变的循环代码(现在每次得到独立的新数组)
for (int i = 1; i < gMul.GetLength(0); i++) { byte[] shifted = shift(gMul[i - 1]); gMul[i] = shifted; }
验证修复结果
用你的测试例子验证:
gMul[0] = new byte[] {2 , 3 , 2 , 2}gMul[1]会得到{2 , 2 , 3 , 2}gMul[2]会得到{2 , 2 , 2 , 3}gMul[3]会得到{3 , 2 , 2 , 2}
完全符合你的预期!
内容的提问来源于stack exchange,提问作者elpmeplz
相关产品推荐
相关产品推荐

