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

来源:互联网 发布:python socket 长度 编辑:程序博客网 时间:2024/06/06 09:48

以两个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    }}
2 0
原创粉丝点击