zoukankan      html  css  js  c++  java
  • 字符串反转

    方法一:利用异或字符的数值进行反转实现字符的反转,该方法不使用额外的变量。

    package String;
    
    public class StringReverse {
        public static void main(String[] args) {
            String s="hello";
            System.out.println(new StringReverse().ReverseByXor(s));
        }
        public static String ReverseByXor(String original)
        {
            char[] charArray = original.toCharArray();
            int l = original.length() - 1;
            for (int i = 0; i < l; i++, l--)
            {
                charArray[i] ^= charArray[l];
                charArray[l] ^= charArray[i];
                charArray[i] ^= charArray[l];
            }
            return new String(charArray);
        }
    }

    使用异或交换数值的原理:

    大家都知道,假如有a,b两个整型数,我们可以用

    a^=b;
    b^=a;
    a^=b;

    来交换a,b的值,在这里我说说其中的原理:
    ^ 在 C 里面是按位异或操作符,相同的话异或的结果就是 0,不同的话就是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:

    a = 0101   (5 的二进制表示)
    b = 1100   (12 的二进制表示)
        ----
    c = 1001   (结果为 9)


    可以看出 c 中是 1 的部分就是 a 和 b 二进制表示对应位不同的部分,0 则是相同的部分。

    牢记以下两条原则:
    任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
    任何一位二进制数同 0 异或都保持不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)

    因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b:
    a = 0101
    c = 1001
        ----
    b = 1100


    同样, b 与 c 异或结果就变成了 a:
    b = 1100
    c = 1001
        ----
    a = 0101

  • 相关阅读:
    dom2级事件兼容性写法
    cookie js案例
    cookie讲解
    js高级总结
    鼠标拖拽时,选择文字问题
    正则的细节
    正则捕获的细节及replace分析
    正则的使用及replace细讲
    while循环的讲解
    acwing 189. 乳草的入侵 bfs
  • 原文地址:https://www.cnblogs.com/lyr2015/p/7420166.html
Copyright © 2011-2022 走看看