算法很美笔记整理(先导课1-位运算的一些应用)

位运算的一些应用(蓝桥学院)

参考了

java中位运算和移位运算详解

先补一补知识

1.正数的源码是他的反码和补码
2.负数的反码是将他源码除符号位进行按位取反
3.负数的补码是将他反码加1得到的
//后面的运算都建立在补码之上
4.按位与 & : 两个相应的二进制对应,同为1是1,否则为0
5.按位或 | :有1为1,否则为0
6.异或 ^ : 相同为零, 否则为1
7.<<: 左移运算, 右边空出的位用0填补, 高位左移溢出则舍弃该高位
8.>>:右移运算, 左边空出的位,正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;低位右移溢出则舍弃该位。
9.>>> : 无符号右移, 正数与右移规则一样,负数的无符号右移,就是相应的补码移位所得,在高位补0即可

一、判断是奇数还是偶数

这里用到了按位与,与1进行按位与,前面的数全都为0,而最后一个数如果与1相同,则是奇数(按位与的值为1),如果最后一个数与你不同,则是偶数(按位与的值是0)

import java.util.Scanner;

public class Hello {
    
    
    public static void main(String[] args) {
    
    
    //判断一个数是奇数还是偶数
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个数");
        while(true) {
    
    
            int a = sc.nextInt();
            System.out.println(a + "是:" + (((a & 1) == 0) ? "偶数" : "奇数"));
        }
    }
}

二、判断二进制位上的数字

同一一样,这里使用了按位与的技巧

import java.util.Scanner;

public class Hello {
    
    
    public static void main(String[] args) {
    
    
    //获取二进制位是0还是1,这里指的是补码
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个数");
        while(true) {
    
    
            int a = sc.nextInt();
            System.out.println(a + "第5个二进制位是:" + ((((a>>4) & 1) == 0)?0:1));//这里取第5个(从右往左)
        }
    }
}

三、交换两个数

这里需要了解点知识,自己异或自己为0,自己异或0为自己

import java.util.Scanner;

public class Hello {
    
    
    public static void main(String[] args) {
    
    
    //使用异或技巧交换两个数
        Scanner sc = new Scanner(System.in);
        System.out.println("输入两个数");
        while(true) {
    
    
            int a = sc.nextInt();
            int b = sc.nextInt();
            a = a ^ b;
            b = a ^ b;//把上面的东西带进去, b^b为0, a^0为a
            a = a ^ b;//把上面的东西带进去, a^a为0, b^0为b
            System.out.println(a + " " + b);
        }
    }
}

四、求一个数的绝对值

//思路:一个数先将他带符号右移,会把符号位移到所有的位置上去,再与自身进行异或运算,正数的补码不变,负数的补码相当于取反

//最后在进行加一,而这个时候只改变了符号位,与将原码转换为补码的思路一样,可以尝试下将原码进行两次转换,会回到最初的情况。

import java.util.Scanner;

public class Hello {
    
    
    public static void main(String[] args) {
    
    
    //求绝对值
        Scanner sc = new Scanner(System.in);
        System.out.println("输入一个数");
        while(true) {
    
    
            int a = sc.nextInt();
            System.out.println((a ^ (a>>31)) + (a>>>31));//注意区分无符号移动和有符号移动

        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45911278/article/details/112623125
今日推荐