2

我正在从 Jay Bryant 的书 - Java 7 for Absolute Beginners 中学习 Java。在第 164 页上有一个特定的示例,他使用以下特定方法阅读然后反转文本文件的内容:

private static void reverseByteArray(byte[] inBytes) {
    int inLength = inBytes.length;
    for (int i = 0; i < (inLength >>1); i++) {
        byte temp = inBytes[i];
        inBytes[i] = inBytes[inLength - i - 1];
        inBytes[inLength - i - 1] = temp;
    }
}

我的问题是,对于 (int i = 0; i < (inLength >>1) ; i++) {

- 它在整个反转文本内容的操作中的作用是什么?

我相信我理解了for循环下的后续代码,即将第一个字节的值与最后一个字节的值交换。

如果不存在按位移位运算符,则输出不会反转。

初始:睡觉:可能做梦:是的,问题来了;因为在那死亡的沉睡中,梦想可能会到来当我们摆脱了这凡人的缠绕时,必须让我们停下来:有一种尊重使如此漫长的生命成为灾难

输出: efil gnol os fo ytimalac sekam tahT tcepser eht s'ereht :esuap su evig tsuM ,lioc latrom siht ffo delffuhs evah ew nehW emoc yam smaerd tahw htaed fo skins taht ni roF ;bur eht s'ereht , ya emah: : 剥皮

谢谢你。

4

4 回答 4

4

移位运算符在以下行中做了什么

要反转数组,您只需要迭代直到它的长度的一半。这就是位移运算符正在做的事情。位移 1 会截断最后一位,相当于除以 2。

length >> 1  == length / 2

如果不存在按位移位运算符,则输出不会反转

如果您迭代 until length,然后 until length / 2,每个元素将从最后与相应的元素交换。但是,从那开始将开始交换元素,元素向左。因此,最终数组将与原始数组相同。

考虑这个简单的例子: arr = [1, 2, 3, 4, 5]

  • 您从 index 开始,并与,0交换,数组变为:arr[0]arr[4]

    [5, 2, 3, 4, 1]
    
  • index = 1arr[1],交换arr[3]:

    [5, 4, 3, 2, 1]
    

直到这里一切都很好,你只需在一半长度之前迭代。现在,如果您继续进行:

  • index = 2, 交换arr[2]arr[2], 没有变化

  • index = 3,交换arr[3]arr[1]

    [5, 2, 3, 4, 1]
    

看,数组开始改变到以前的状态。

于 2013-08-10T07:30:23.277 回答
1

将 int 右移 1 相当于将其二进制表示从右侧截断一位。这显然相当于执行整数除以二。(你可以用一个简短的程序来测试它,或者通过观察,例如,二进制 101 >> 1 == 二进制 10)

然后,此 for 循环的测试步骤将 i 与 inLength/2 进行比较 像往常一样,应用此运算符不会更改 inlength(运算符返回结果而不更改其参数,就像 5+4 不会更改值一样5 或 4)

这个测试的作用只是绑定循环:我们遍历字符串的一半。

于 2013-08-10T07:33:13.960 回答
0

>>是一个有符号右移运算符,它有效地将每一步的值减半。
<<是左移运算符,它有效地将值加倍。
>>>是一个无符号右移运算符,它总是用 0 填充 MSB。

于 2013-08-11T02:08:12.190 回答
0
(inLength >> 1) == (int) inLength / 2
于 2013-08-10T07:40:05.847 回答