【问题标题】:Java - how does reversing byte array with bitwise shift operator work in this example?Java - 在此示例中如何使用按位移位运算符反转字节数组?
【发布时间】:2013-08-10 07:28:01
【问题描述】:

我是从 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;
    }
}

我的问题是移位运算符在以下行中的作用是什么 for (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 山药 smaerd tahw htaed fo 果皮 taht ni roF ;bur eht s'ereht ,ya :maerd ot ecnahcrep :peels oT

谢谢。

【问题讨论】:

    标签: java arrays byte reverse shift


    【解决方案1】:

    下一行中的移位运算符做了什么

    为了反转数组,您只需要迭代直到它的长度的一半。这就是位移运算符正在做的事情。位移 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]
      

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

    【讨论】:

    • 如果长度是奇数,它不会尝试反转中间元素,因为&gt;&gt; 会截断奇数位。
    • 感谢您的回复。我完全理解!
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:
      (inLength >> 1) == (int) inLength / 2
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-21
          • 2014-12-30
          • 1970-01-01
          相关资源
          最近更新 更多