栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

位运算被玩出花了

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

位运算被玩出花了

目录

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 &= 95;
             }
             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();
     }
 }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/657939.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号