Java - 在这个例子中,如何使用按位移位运算符来反转字节数组?

时间:2013-08-10 07:28:02

标签: java arrays byte reverse shift

我正在从书中学习Java--Jay Bryant的Java 7 for Absolute Beginners。第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;
    }
}

我的问题是按位移位运算符在下一行中做了什么 for(int i = 0; i&lt; (inLength&gt;&gt;&gt; 1); i ++){

- 它在整个翻转文本内容的操作中扮演什么角色?

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

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

初​​始: 睡觉:梦见:唉,有揉搓; 因为在那种死亡的睡眠中,梦想可能会来临 当我们拖着这个致命的线圈, 必须暂停:有尊重 这使得如此长寿的灾难

输出: efil gnol os fo ytimalac sekam tahT tserser eht s'ereht:esuap su evig tsuM ,lioc latrom siht ffo delffuhs evah ew nehW emoc yam smaerd tahw htaed fo peels taht ni roF ; bur eht s'ereht,ya:maerd ot ecnahcrep:peels oT

谢谢。

4 个答案:

答案 0 :(得分:4)

  

按位移位运算符在以下行中执行的操作

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

length >> 1  == length / 2
  

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

如果迭代到length,那么直到length / 2,每个元素将与末尾的相应元素交换。但是,从那里继续前进将开始交换元素,元素朝左。因此,最终的数组将与原始数组相同。

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

  • 您从索引0开始,并将arr[0]arr[4]交换,数组变为:

    [5, 2, 3, 4, 1]
    
  • index = 1,与arr[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]
    

请参阅,数组开始更改为先前的状态。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

(inLength >> 1) == (int) inLength / 2

答案 3 :(得分:0)

>>是一个签名的右移操作符,可以有效地将每次移动的值减半 <<是左移运算符,有效地使值加倍 >>>是一个无符号右移运算符,它总是用0填充MSB。