位运算被玩出花了

本文介绍了一种使用位运算优化字符串中的大写字母转换为小写字母的方法,通过位运算实现字符编码的转换,提高了代码效率。同时,还探讨了如何进行小写转大写以及字符串中字母的相互转化,并提供了相应的Java代码实现。
摘要由CSDN通过智能技术生成

目录

12.12每日一题

1.题目描述

2.直接API调用

3.自己实现API

3.位运算优化

4.拓展

小写转大写

相互转化


12.12每日一题

1.题目描述

709. 转换成小写字母

给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。

 输入:s = "Hello"
 输出:"hello"

看来是不是很简单??


2.直接API调用

 class Solution 
 {
     public String toLowerCase(String s) 
     {
         return s.toLowerCase();
     }
 }

3.自己实现API

A-Z [65,90]

a-z [97,122]

大写字母的Unicode编码(向下兼容ASCII码)和小写字母的Unicode差32,所以我们直接+32即可

注意:Java中String不可变,所以需要创建一个StringBuilder来拼接

 class Solution 
 {
     public String toLowerCase(String s) 
     {
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < s.length(); i++)
         {
             char ch = s.charAt(i);
             if (ch >= 'A' && ch <= 'Z')
             {
                 ch += 32;
             }
             sb.append(ch);
         }
         return sb.toString();
     }
 }

3.位运算优化

没想到吧,这题也能用位运算!!

A-Z [65,90]

a-z [97,122]

65 对于的二进制为 0100 0001

66 对应的二进制为 0100 0010

.....

90 对应的二进制为 0101 1010

它们的差值 32 对应的二进制位是 0010 0000

我们不难发现,65-90 的二进制位中表示 32 的那位二进制都是 0(即从右往左数第六位),而 97-122 表示 32 的那位二进制都是 1, 所以我们只需要把 从右往左数第六位 由0变为1即可,所以可以对大写字母与32进行按位或,来代替加法。

例如 :

A ==  0100 0001

      |  0010 0000

     =  0110 0001 == ‘a'

 class Solution 
 {
     public String toLowerCase(String s) 
     {
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < s.length(); i++)
         {
             char ch = s.charAt(i);
             if (ch >= 'A' && ch <= 'Z')
             {
                 ch |= 32;
             }
             sb.append(ch);
         }
         return sb.toString();
     }
 }

4.拓展

小写转大写

按照上面的规律,只需要把表示 32 的那位二进制位变为 0 即可(即从右往左数第六位),所以我们可以让小写字母与 1101 1111 (十进制对应 223 )进行按位与运算

例如:

a == 0110 0001

    & 1101 1111

    = 0100 0001 == 'A'

 class Solution 
 {
     public String toLowerCase(String s) 
     {
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < s.length(); i++)
         {
             char ch = s.charAt(i);
             if (ch >= 'a' && ch <= 'z')
             {
                 ch &= 223;
             }
             sb.append(ch);
         }
         return sb.toString();
     }
 }

相互转化

把1变为,把0变1,即与32进行按位异或

 class Solution 
 {
     public String toLowerCase(String s) 
     {
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < s.length(); i++)
         {
             char ch = s.charAt(i);
             ch ^= 32;
             sb.append(ch);
         }
         return sb.toString();
     }
 }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值