我正在从书中学习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
谢谢。
答案 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。