交换单个字母单词的大小写

我发现这个代码用于交换案例,但我对它是如何工作有点困惑。

class Main {
  private static String swapCase(String s) {
      String r = "";
      for (char c : s.toCharArray())
          r += c ^= 32; // this line
      return r;
  }

  public static void main(String[] args) {
    System.out.println(swapCase("Hello"));
  }}

我明白它会遍历每个角色。但是,我无法绕过线(特别是XOR运算符)

r += c ^= 32;

我的意思是什么的重要性32。如何交换案件。

有人能帮助我吗?


慕斯709654
浏览 440回答 3
3回答

Smart猫小萌

这就是ASCII的设置方式。来自a-z第6位的信件设置为1; 而来自A-Z第6位的字母设置为0。32 = 100000 // the 6-th bit is set to 1使用int将执行XOR 反转第6位。您可以做一些调试并看到自己:for (char c : s.toCharArray()) {         System.out.println(Integer.toBinaryString((int) c));         c ^= 32; // this line         System.out.println(Integer.toBinaryString((int) c));}

白衣染霜花

让我们看看这张表,你会明白为什么a = 01100001    A = 01000001 b = 01100010    B = 01000010 c = 01100011    C = 01000011 d = 01100100    D = 01000100 e = 01100101    E = 01000101 f = 01100110    F = 01000110 g = 01100111    G = 01000111 h = 01101000    H = 01001000 i = 01101001    I = 01001001 j = 01101010    J = 01001010 k = 01101011    K = 01001011 l = 01101100    L = 01001100 m = 01101101    M = 01001101 n = 01101110    N = 01001110 o = 01101111    O = 01001111 p = 01110000    P = 01010000 q = 01110001    Q = 01010001 r = 01110010    R = 01010010 s = 01110011    S = 01010011 t = 01110100    T = 01010100 u = 01110101    U = 01010101 v = 01110110    V = 01010110 w = 01110111    W = 01010111 x = 01111000    X = 01011000 y = 01111001    Y = 01011001 z = 01111010    Z = 01011010 与上部和下部版本的唯一区别是第5位(从0开始计数)。这就是为什么使用简单的XOR面罩,您可以来回更换外壳。

慕侠2389804

对于ASCII编码,32是小写字母和大写字母之间的差异。它是2的幂,它的二进制表示是一个1位: 0010 0000。通过应用XOR赋值运算符,可以在字符值中更改此位。有效地添加(如果该位为0 in c)或减去(bit为1 in c)32。这对于字母AZ和az都可以正常工作,但很可能对输入中的大多数其他字符都是无意义的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java