| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /**
- * @author WanJl
- * @version 1.0
- * @title Demo06
- * @description 位运算符
- * @create 2026/7/14
- */
- public class Demo06 {
- /*
- 位运算符是用来直接操作 整型(byte/short/int/long/char)的二进制位,性能极高,在底层编程、权限控制、编码算法中使用的比较多
- & 按位与 5&3 0101 & 0011 = 0001
- | 按位或 5|3 0101 & 0011 = 0111
- ^ 按位异或 5^3 0101 & 0011 = 0110
- ~ 按位取反 ~5 ~0101 = 1010
- << 按位左移 5<<1 0101 << 1 = 1010
- >> 按位右移 5>>1 0101 >> 1 = 0010
- >>> 无符号右移 5>>>1 0101 >> 1 = 0010
- */
- public static void main(String[] args) {
- // 按位与 & 符号左右两边的数的每个二进制位,如果同时为1,则运算结果为1,否则为0,然后再把二进制数转换为十进制数
- //比如 5 & 3
- // 0101
- // 0011
- // 0001
- System.out.println(5&3); //1
- // 按位或 | 符号左右两边的数的每个二进制位,如果同时为0,则运算结果为0,否则为1,然后再把二进制数转换为十进制数
- //比如 5 | 3
- // 0101
- // 0011
- // 0111
- System.out.println(5|3); //7
- // 按位异或 ^ 符号左右两边的数的每个二进制位,如果相同则为0,不同则为1,然后再把二进制数转换为十进制数
- //比如 5 ^ 3
- // 0101
- // 0011
- // 0110
- System.out.println(5^3); //6
- // 按位取反 单目运算符,符号右边的数的二进制位,如果为0,则运算结果为1,如果为1,则运算结果为0
- //比如 ~5 8位
- // 0000 0101
- // 1111 1010
- System.out.println(~5); //-6
- //按位左移 << 把符号左边的数的二进制位,向左移动符号右边的个数,空出来的位置补0
- // 5<<1
- // 0101
- // 1010 末位补0
- System.out.println(5<<3); //把符号左边的5的二进制数0101,向左移动符号右边个数 3,空出来的位置补0
- // 按位右移 >> 把符号左边的数的二进制位,向有移动符号右边的个数,空出来的位置补【符号位】的值
- // 二进制数的最左侧为最高位,也就是符号位,符号位如果是0,那么这个二进制数就是正数,如果是1,这个二进制数就是负数
- // 8位2进制数 1010 1111 这就是负数
- // 16位2进数 0000 0000 1010 1111 这就是正数
- // 5>>1
- // 0101
- // 0010 右侧多出来的1,被截断。左侧空出来的补符号位 0
- System.out.println(5>>3); //6 把符号左边的5的二进制数0101,向右移动符号右边个数 3,空出来的位置补符号位
- //无符号右移 >>> 把符号左边的数的二进制位,向有移动符号右边的个数,空出来的位置补0
- // 8位 -5
- // 1111 1011
- // 0111 1101
- System.out.println(-5>>>1); // 把符号左边的-5的二进制数1111 1011,向右移动符号右边个数 1,空出来的位置补0,从负数变为正数
- /*
- 左移:高位丢失,低位补0,相当于 ×2
- 右移:低位丢失,高位补符号位,相当于 ÷2 并且向下取整
- 无符号右移:低位丢失,高位补0,对负数会得到大正数
- */
- /*
- 编程运行,查看结果
- 15>>3
- 66<<2
- 75&86
- 63|36
- -128>>>3
- */
- }
- }
|