算法之美 | 位运算的巧妙奥秘(二) | JAVA中位运算的实际应用


前言

传智杯初赛后有感而写,我目前阶段所学习的算法,只是最基础的数学,对于数字和数学公式还是不敏感,在小卡与质数2那道题,解题的思路只有最基础的方法,然而结果是超时,在优化的过程中,发现了位运算的一些巧妙奥秘,谨以此篇文章记载。


一、位运算

关于位运算的符号以及他的一些规则还是有必要去记录一下的(详细记录请见):

名称符号
按位或
按位与&
按位非~
按位异或^
左移<<
右移>>

二、位运算的奇思妙用

熟悉以下各种位运算的扩展使用,可能会在你做题的过程中达到意向不到的妙用哦

1.将大写字母转换成为小写字母

  public class Main {
    public static void main(String[] args) {

        char a='B';
        a= (char) (a|' ');
        System.out.println(a);
    }
}

自己的不官方理解:


运行结果:

b

暂时没有理解,下次一定。

2.位运算表示乘除法

public class Main {
    public static void main(String[] args) {

        int a=10;
        //向右 移位 1表示  除以 2
        a>>=1;
        System.out.println("10向右位移 1表示10/2:"+a);

        //向左位移 1表示乘2
        a=10;
        a<<=1;
        System.out.println("10向左位移1表示10*2:"+a);
    }
}

不官方理解:

运行结果:

10向右位移 1表示10/25
10向左位移1表示10*220

优点:运算速度会比乘除快。

理解:暂时只会用

3.位运算判断奇偶性

public class Main {
    public static void main(String[] args) {

        int[] arr={1,2,3,4,5,6,7,8,9,0};
        for (int i = 0; i < 10; i++) {
            if((arr[i]& 1)==0){
                System.out.println(arr[i]+"是偶数");
            }else{
                System.out.println(arr[i]+"是奇数");
            }
        }
    }
}

不官方理解:

运行结果:
1是奇数
2是偶数
3是奇数
4是偶数
5是奇数
6是偶数
7是奇数
8是偶数
9是奇数
0是偶数

理解:根据数的二进制可知,二进制数的最后一位如果是0 那么这个数为偶数,如果一个数的二进制数的最后一位是1,
那么这个数肯定是奇数。

4.利用异或交换两数

public class Main {
    public static void main(String[] args) {

        //不使用介质交换两数
        int a=5,b=4;
        a^=b;
        b^=a;
        a^=b;
        System.out.println("a="+a);
        System.out.println("b="+b);
    }
}

不官方理解:

运行结果:
a=4
b=5

理解: 暂时没有

5.正负号交换

public class Main {
    public static void main(String[] args) {

        int a=3;
        a=~a+1;
        System.out.println(a);

    }
}

不官方理解:

运行结果:
-3

理解: 整数取反加1,正好变成其对应的负数(补码表示);负数取反加一,则变为其原码,即正数

6.位运算求绝对值

public class Main {
    public static void main(String[] args) {
        
        //根据整数右移 31 位得到 0,负数右移 31 位得到 -1,判断符号位
        int a=-32;
        a=(a>>31)==0?a:(~a+1);
        System.out.println("-32的绝对值为" + a);

        //也可以使用大于零来判断符号位
        int b=-32;
        b=b>0 ?b :(~b+1);
        System.out.println("-32的绝对值为"+b);

    }
}

不官方解释:


运行结果:
-32的绝对值为32

理解:整数的绝对值是整数 负数的绝对值正好可以对其进行取反加一求得,
不过在此之前我们要判断一下符号位(根据移位判断或者根据大于零小于零来判断)

7.计算平均值

public class Main {
    public static void main(String[] args) {
       int a=10,b=20;
       int average=(a&b)+(a^b)>>1;
        System.out.println(average);
    }
}

不管方解释:


因为在计算平均数的过程中,有可能会在a+b的溢出,因此我们可以使用上面的算法进行优化。

对于位运算的使用扩展暂时到此为止了。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值