java 与或非异或右移左移(&|~ ^ >> << >>>)

public static void main(String[] args) {
        
        /**
         *   & 与运算
         *       1, 二进制都为1才为1;
         *       
         */
        /*System.out.println(5 & 3);  // 101 & 11 = 1 --> 1
        System.out.println(5 & 3);  // 11 & 101 = 1 --> 1
        System.out.println(-5 & 4); // 11111011 & 100 = 0 --> 0
        System.out.println(-10 & 5); // 11110110 & 101 = 100 --> 4
        */
        /**
         *  | 或运算
         *      1, 如果相对应位都为0,则结果为0,否则为1
         *       2, 只取8位进行计算, 不是32位
         */
        /*System.out.println(5 | 3); // 101 | 11 = 111 --> 7
        System.out.println(3 | 5); // 11 | 101 = 111 --> 7
        System.out.println(-5 | 3); // 11111011 | 11 = 11111111 --> -3
        System.out.println(5 | -3); // 101 | 11111101 = 11111101 --> -5
        */
        
        
        /**
         *  ~ 非运算, 按位取反
         *      1,重点
         *      2, 流程: 原码 --》 反码 --》 补码 --》补码 --》反码 --》 原码
         *      2,取八位计算,int(32位):
         *           比如 :5 的二进制 补码是: 00000101
         *          取反补码是:                               11111010
         *          补码转反码-1:                        11111001
         *          反码转原码(最高位为1,负数):10000110 
         *          结果: -6  
         *          
         *          如果是负数:-5
         *              -5的补码: 11111011
         *             -5取反补码:    00000100
         *          现在补码是正数:    即结果为:4                              
         */
        /*System.out.println("----非运算 ~ -----");
        System.out.println(~5);
        System.out.println(~-5);*/
        
        /**
         *  ^ 异或运算
         *      1, 相对应位相同,则结果为0,否则为1:
         *          例如:110 ^ 110 = 000 --> 0
         *      2, 负数运算:-6 ^ 5:(取八位计算)
         *          -6补码:11111010
         *          5补码:    00000101
         *       -6^5补码:    11111111
         *             结果反码:11111110
         *                                      原码:          10000001
         *              结果:-1
         */
        /*System.out.println("----异或运算 ^ -----");
        System.out.println(6^6); // 110 ^ 110 = 000 ---> 0
        System.out.println(6^5); // 110 ^ 101 = 011 --> 3
        System.out.println(-6^5); //
        */
        
        
        
        /**
         * >> 右移
         *         右端被移除,左端移入原来最高位,现在最高位是1
         *         例子:-5 >> 1:
         *             -5补码:11111011
         *             右移1位:11111101   :右端被移除,左端移入原来最高位,现在最高位是1
         *             反码:        11111100:减去1  
         *             原码:        10000011: 
         *             结果:       -3
         */
        /*System.out.println("----右移 >> -----");
        System.out.println((4>>2)); // 100 >> 2 = 1 --> 1
        System.out.println(8>>2);  // 1000 >> 2 = 10 --> 2
        System.out.println(4>>1);  // 100 >> 1 = 10 -->2
        System.out.println(8>>1);  // 1000 >> 1 = 100 -->4
        System.out.println(-5>>1); // 
        */
        
        /**
         *  << 左移
         *      最高位溢出,最低为补0
         *      
         */
        /*System.out.println(4<<2); // 100 << 2 = 10000 --> 16;
        System.out.println(10<<2); // 1010 << 2 = 101000 --> 40
        */
        
        /**
         *  >>> 无符号右移
         *      最低位移除,最高位补零,与 ‘>>’ 最高位移入最高位不同
         *      例子:-10>>>2
         *          -10补码: 11111111 11111111 11111111 11110110
         *          右移两位:   00111111 11111111 11111111 11111101
         *          结果:             1073741821
         */
        /*System.out.println(10>>>1); // 1010 >>> 1 = 0101 --> 5
        System.out.println(10>>>2); // 1010 >>> 2 = 0010 ---> 2
        System.out.println(2>>>3);  // 0010 >>> 3 = 0000 ----> 0
        System.out.println(-10>>>2); // 
        */
        
        /**
         *        例子:128 >> 1 returns 128/ 2 = 64
                256 >> 4 returns 256/ 16 = 16
                -256 >> 4 returns -256/ 16 = -16
                16<<2      return  16 * 4 = 64
                -16<<2     return  -16 * 4 = -64
         */
        System.out.println(-256>>4); //-16
        System.out.println(-32>>2);        //-8
        System.out.println(16<<2);   //16*2*2 = 64
        System.out.println(-16<<2);  //-16*2*2 = -64
        
        System.out.println(256>>>4);   //16
        System.out.println(-256>>>4);    //268435440
        
    }

 

posted @ 2020-08-12 20:38  maigao  阅读(159)  评论(0编辑  收藏  举报