Java学习中位运算符底层运算过程

以两个int型数据为例子,详细的描述它们之间进行& | ^操作的底层二进制运算过程,并分别对它们进行取反操作。

/**
    两个int型数据进行& |   ^操作,并对它们进行~
    底层二进制运算过程
    取反:取反操作后,若为正数,变为负数,且数值比原来大1
                      若为负数,变为正数,且数值比原来小1
*/
public class BinaryTest {

    public static void main(String[] args) {
        //若为正数,前边的0可以省略,若为负数,不能省略 int 4字节
        int a = 0xA9;   //0000 0000 0000 0000 0000 0000 1010 1001 ->169
        int b = 0xC7;   //0000 0000 0000 0000 0000 0000 1100 0111 ->199
        /*
            0000 0000 0000 0000 0000 0000 1010 1001 a 
                                                    &   (有0为0,与操作只有全为1才能得1)
            0000 0000 0000 0000 0000 0000 1100 0111 b

            0000 0000 0000 0000 0000 0000 1000 0001 ->0x81->129
        */
        System.out.println(a & b);

        /*
            0000 0000 0000 0000 0000 0000 1010 1001 a 
                                                    |   (有1为1,或操作只要有一个是1就得1)
            0000 0000 0000 0000 0000 0000 1100 0111 b

            0000 0000 0000 0000 0000 0000 1110 1111 ->0xEF->239
        */
        System.out.println(a | b);

        /*
            0000 0000 0000 0000 0000 0000 1010 1001 a 
                                                    ^   (异或操作,只有不同时才得1,相同得0)
            0000 0000 0000 0000 0000 0000 1100 0111 b

            0000 0000 0000 0000 0000 0000 0110 1110 ->0x6E->110
        */
        System.out.println(a ^ b);

        /*  
            0000 0000 0000 0000 0000 0000 1010 1001 a
                                                    ~  (按位取反,包括符号位)
            1111 1111 1111 1111 1111 1111 0101 0110 ->  

            求值过程(底层保存为补码,负数求原码 先减一 --> 除符号位按位取反)
        减一1111 1111 1111 1111 1111 1111 0101 0101 ->    
        取反1000 0000 0000 0000 0000 0000 1010 1010 ->0x8000 00AA->-170   (除符号位进行取反)  
        */
        System.out.println(~ a);

        /*
            0000 0000 0000 0000 0000 0000 1100 0111 b
                                                    ~
            1111 1111 1111 1111 1111 1111 0011 1000 ->

            求值过程(底层保存为补码,负数求原码 先减一 --> 除符号位按位取反)
        减一1111 1111 1111 1111 1111 1111 0011 0111 ->
        取反1000 0000 0000 0000 0000 0000 1100 1000 ->0x8000 00C8->-200

        */
        System.out.println(~ b);

        /*
        原码1000 0000 0000 0000 0000 0000 0000 0110
        补码1111 1111 1111 1111 1111 1111 1111 1010
                                                    ~
            0000 0000 0000 0000 0000 0000 0000 0101
        */
        System.out.println(~ (-6));        // 5 若为负数,变为正数,且数值比原来小1
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值