Java中可用异或32实现大小写转换,因ASCII码中大小写字母仅第5位(值为32)不同,异或可翻转该位,如c^32即可互换。

Java 中可以通过位运算快速实现大小写字母转换,核心在于利用 ASCII 码中大小写字母的编码规律:大写字母 A–Z 是 65–90(二进制末 6 位为 000001 到 010010),小写字母 a–z 是 97–122(二进制末 6 位为 100001 到 110010)。两者仅在第 6 位(从 0 开始数,即 bit 5,对应十进制值 32)不同 —— 小写比大写多 32。
用异或 32 实现大小写互转
因为大小写只差一个比特位(bit 5),而异或操作可翻转指定位,所以对字母字符异或 32(即 0x20 或 1 )就能切换大小写:
- 大写 → 小写:`c | 32` 或 `c ^ 32`(推荐 `^ 32`,更直观体现“翻转”)
- 小写 → 大写:同样用 `c ^ 32`(异或两次等于原值,天然可逆)
- 注意:该操作仅对 ASCII 字母安全。非字母字符(如数字、符号)异或 32 后会变成其他字符,需先校验是否为字母
安全转换:先判断再运算
直接对任意 char 做 `^ 32` 可能出错,应结合 `Character.isUpperCase()` / `isLowerCase()` 判断:
- 转小写:
Character.isUpperCase(c) ? (char)(c ^ 32) : c - 转大写:
Character.isLowerCase(c) ? (char)(c ^ 32) : c - 也可用范围判断:
c >= 'A' && c 或 <code>c >= 'a' && c ,效率略高但可读性稍弱
批量处理字符串的高效写法
避免创建新 String 对象,可用 `toCharArray()` 原地修改(适合只读场景或已知字符串不共享):
立即学习“Java免费学习笔记(深入)”;
- 转全小写示例: char[] cs = str.toCharArray();
- 若需兼容非 ASCII(如带重音符号),位运算不适用,应回退到 `String.toLowerCase(Locale.ROOT)`
for (int i = 0; i if (cs[i] >= 'A' && cs[i] }
String lower = new String(cs);
为什么不用 `| 32` 和 `& ~32`?
虽然 `c | 32` 能把大写变小写(置位),`c & ~32` 能把小写变大写(清位),但二者不可逆且不通用:
- `c | 32` 对小写字母无效(本来就有 bit5=1),但对非字母如 `'0'`(48)会得到 `'p'`(112),结果不可控
- `c & ~32` 对大写字母有效,但对小写字母以外的字符也可能误改(如 `'{'` 变成 `'['`)
- `^ 32` 是唯一既简洁又可逆、且逻辑清晰的位操作选择


















