java位运算(包含推算过程):左移,右移,无符号右移,取反运算,与运算,或运算,异或运算

原反补码

正数:原码,反码,补码都一样,三码合一
负数:反码为原码符号位不变,其他位取反,补码则是在反码基础上加1

1:左移:最左边丢弃,最右边补0,符号位相当于会一起移动,所以在某些数字的位移,会出现正数,负数的交替。位移如果超过或等于最大位数,实际位移数为:位移数%类型的位数(下面例子是int类型,位数为32)

正数左移

	/**
     * 左移正数
     */
    @Test
    public void leftShiftPositiveNumber() {
        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00010100
        System.out.println("10 << 1 = " + (10 << 1));

        // 00000000 00000000 00000000 00001010 -> 01010000 00000000 00000000 00000000
        System.out.println("10 << 27 = " + (10 << 27));

        // 00000000 00000000 00000000 00001010 -> 10100000 00000000 00000000 00000000
        // 10100000 00000000 00000000 00000000 -> 10011111 11111111 11111111 11111111 -> 11100000 00000000 00000000 00000000
        System.out.println("10 << 28 = " + (10 << 28));

        // 00000000 00000000 00000000 00001010 -> 01000000 00000000 00000000 00000000
        System.out.println("10 << 29 = " + (10 << 29));

        // 00000000 00000000 00000000 00001010 -> 10000000 00000000 00000000 00000000
        System.out.println("10 << 30 = " + (10 << 30));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
        System.out.println("10 << 31 = " + (10 << 31));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00001010
        System.out.println("10 << 32 = " + (10 << 32));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00010100
        System.out.println("10 << 33 = " + (10 << 33));
    }

输出:

在这里插入图片描述

负数左移

	/**
     * 左移负数
     */
    @Test
    public void leftShiftNegativeNumber() {
        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11101100 -> 11111111 11111111 11111111 11101011 -> 10000000 00000000 00000000 00010100
        System.out.println("-10 << 1 = " + (-10 << 1));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 10110000 00000000 00000000 00000000 -> 10101111 11111111 11111111 11111111 -> 11010000 00000000 00000000 00000000
        System.out.println("-10 << 27 = " + (-10 << 27));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 01100000 00000000 00000000 00000000
        System.out.println("-10 << 28 = " + (-10 << 28));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11000000 00000000 00000000 00000000 -> 10111111 11111111 11111111 11111111 -> 11000000 00000000 00000000 00000000
        System.out.println("-10 << 29 = " + (-10 << 29));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 10000000 00000000 00000000 00000000
        System.out.println("-10 << 30 = " + (-10 << 30));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 00000000 00000000 00000000 00000000
        System.out.println("-10 << 31 = " + (-10 << 31));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11110110 -> 11111111 11111111 11111111 11110101 -> 10000000 00000000 00000000 00001010
        System.out.println("-10 << 32 = " + (-10 << 32));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11101100 -> 11111111 11111111 11111111 11101011 -> 10000000 00000000 00000000 00010100
        System.out.println("-10 << 33 = " + (-10 << 33));
    }

输出:

在这里插入图片描述

2:右移

正数右移:符号位不动(动与不动,没有啥区别),最右边丢弃,最左边补0。位移如果超过或等于最大位数,实际位移数为:位移数%类型的位数(下面例子是int类型,位数为32)

	/**
     * 右移正数
     */
    @Test
    public void rightShiftPositiveNumber() {
        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000101
        System.out.println("10 >> 1 = " + (10 >> 1));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000010
        System.out.println("10 >> 2 = " + (10 >> 2));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000001
        System.out.println("10 >> 3 = " + (10 >> 3));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
        System.out.println("10 >> 4 = " + (10 >> 4));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
        System.out.println("10 >> 5 = " + (10 >> 5));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
        System.out.println("10 >> 31 = " + (10 >> 31));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00001010
        System.out.println("10 >> 32 = " + (10 >> 32));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000101
        System.out.println("10 >> 33 = " + (10 >> 33));
    }

输出:

在这里插入图片描述

负数右移:符号位不动(动与不动,没有啥区别),最右边丢弃,最左边补1。位移如果超过或等于最大位数,实际位移数为:位移数%类型的位数(下面例子是int类型,位数为32)

	/**
     * 右移负数
     */
    @Test
    public void rightShiftNegativeNumber() {
        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11111011 -> 11111111 11111111 11111111 11111010 -> 10000000 00000000 00000000 00000101
        System.out.println("-10 >> 1 = " + (-10 >> 1));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11111101 -> 11111111 11111111 11111111 11111100 -> 10000000 00000000 00000000 00000011
        System.out.println("-10 >> 2 = " + (-10 >> 2));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11111110 -> 11111111 11111111 11111111 11111101 -> 10000000 00000000 00000000 00000010
        System.out.println("-10 >> 3 = " + (-10 >> 3));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11111111 -> 11111111 11111111 11111111 11111110 -> 10000000 00000000 00000000 00000001
        System.out.println("-10 >> 4 = " + (-10 >> 4));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11111111 -> 11111111 11111111 11111111 11111110 -> 10000000 00000000 00000000 00000001
        System.out.println("-10 >> 5 = " + (-10 >> 5));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11111111 -> 11111111 11111111 11111111 11111110 -> 10000000 00000000 00000000 00000001
        System.out.println("-10 >> 31 = " + (-10 >> 31));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11110110 -> 11111111 11111111 11111111 11110101 -> 10000000 00000000 00000000 00001010
        System.out.println("-10 >> 32 = " + (-10 >> 32));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11111011 -> 11111111 11111111 11111111 11111010 -> 10000000 00000000 00000000 00000101
        System.out.println("-10 >> 33 = " + (-10 >> 33));
    }

输出:

在这里插入图片描述

3:无符号右移

正数无符号右移:与右移相同

 	/**
     * 无符号右移正数
     */
    @Test
    public void unsignedRightShiftPositiveNumber() {
        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000101
        System.out.println("10 >>> 1 = " + (10 >>> 1));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000010
        System.out.println("10 >>> 2 = " + (10 >>> 2));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000001
        System.out.println("10 >>> 3 = " + (10 >>> 3));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
        System.out.println("10 >>> 4 = " + (10 >>> 4));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
        System.out.println("10 >>> 5 = " + (10 >>> 5));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000000
        System.out.println("10 >>> 31 = " + (10 >>> 31));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00001010
        System.out.println("10 >>> 32 = " + (10 >>> 32));

        // 00000000 00000000 00000000 00001010 -> 00000000 00000000 00000000 00000101
        System.out.println("10 >>> 33 = " + (10 >>> 33));
    }

输出:

在这里插入图片描述

负数无符号位移:与右边不同,符号跟着移动,最左边补0,只要移动就会变成正数

	/**
     * 无符号右移负数
     */
    @Test
    public void unsignedRightShiftNegativeNumber() {
        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 01111111 11111111 11111111 11111011
        System.out.println("-10 >>> 1 = " + (-10 >>> 1));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 00111111 11111111 11111111 11111101
        System.out.println("-10 >>> 2 = " + (-10 >>> 2));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 00011111 11111111 11111111 11111110
        System.out.println("-10 >>> 3 = " + (-10 >>> 3));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 00001111 11111111 11111111 11111111
        System.out.println("-10 >>> 4 = " + (-10 >>> 4));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 00000111 11111111 11111111 11111111
        System.out.println("-10 >>> 5 = " + (-10 >>> 5));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 00000000 00000000 00000000 00000001
        System.out.println("-10 >>> 31 = " + (-10 >>> 31));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 11111111 11111111 11111111 11110110
        System.out.println("-10 >>> 32 = " + (-10 >>> 32));

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 01111111 11111111 11111111 11111011
        System.out.println("-10 >>> 33 = " + (-10 >>> 33));
    }

输出:

在这里插入图片描述

4:取反运算:1变成0,0变成1,符号位也会取反

	/**
     * 取反运算
     */
    @Test
    public void negateTest() {
        // 00000000 00000000 00000000 00001010
        // 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110100 -> 10000000 00000000 00000000 00001011
        System.out.println("~10 = " + ~10);

        // 10000000 00000000 00000000 00001010 -> 11111111 11111111 11111111 11110101 -> 11111111 11111111 11111111 11110110
        // 00000000 00000000 00000000 00001001
        System.out.println("~-10 = " + ~-10);
    }

输出:

在这里插入图片描述

5:与运算:都是1则为1,否则为0,符号位也一起运算

	/**
     * 与运算
     */
    @Test
    public void andOperationTest() {
        // 00000000 00000000 00000000 00001010 & 00000000 00000000 00000000 00000100
        // 00000000 00000000 00000000 00000000
        System.out.println("10 & 4 = " + (10 & 4));

        // 10000000 00000000 00000000 00000100 -> 11111111 11111111 11111111 11111011 -> 11111111 11111111 11111111 11111100
        // 00000000 00000000 00000000 00001010 & 11111111 11111111 11111111 11111100
        // 00000000 00000000 00000000 00001000
        System.out.println("10 & -4 = " + (10 & -4));
    }

输出:

在这里插入图片描述

6:或运算:只要有一个为1就是1,否则为0,符号位也一起运算

	/**
     * 或运算
     */
    @Test
    public void orOperationTest() {
        // 00000000 00000000 00000000 00001010 | 00000000 00000000 00000000 00000100
        // 00000000 00000000 00000000 00001110
        System.out.println("10 | 4 = " + (10 | 4));

        // 10000000 00000000 00000000 00000100 -> 11111111 11111111 11111111 11111011 -> 11111111 11111111 11111111 11111100
        // 00000000 00000000 00000000 00001010 | 11111111 11111111 11111111 11111100
        // 11111111 11111111 11111111 11111110 -> 11111111 11111111 11111111 11111101 -> 10000000 00000000 00000000 00000010
        System.out.println("10 | -4 = " + (10 | -4));
    }

输出:

在这里插入图片描述

7:异或运算:相同为0,不同为1,符号位也一起运算

	/**
     * 异或运算
     */
    @Test
    public void exclusiveOrOperationTest() {
        // 00000000 00000000 00000000 00001010 ^ 00000000 00000000 00000000 00000100
        // 00000000 00000000 00000000 00001110
        System.out.println("10 ^ 4 = " + (10 ^ 4));

        // 10000000 00000000 00000000 00000100 -> 11111111 11111111 11111111 11111011 -> 11111111 11111111 11111111 11111100
        // 00000000 00000000 00000000 00001010 ^ 11111111 11111111 11111111 11111100
        // 11111111 11111111 11111111 11110110 -> 11111111 11111111 11111111 11110101 -> 10000000 00000000 00000000 00001010
        System.out.println("10 ^ -4 = " + (10 ^ -4));
    }

输出:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值