• java按位与、按位或、异或、移位、按位非


        /**
         * 测试按位与、按位或、异或、移位、按位非
         */
        @Test
        public void testYiWei() {
            int i = 3; //对应二进制 ...11
            int j = 2; //对应二进制 ...10
            int k = -3; //对应二进制 10000000 00000000 00000000 00000011(原码)
    
            //按位与& 从高位开始两个都为1 为1,否则 为0
            System.out.println(i & j); //10(2进制) -> 2(10进制)
    
            //按位或| 从高位开始只要1个为1 为1,否则 为0
            System.out.println(i | j); //11(2进制) -> 3(10进制)
    
            //异或^= 从高位开始相同为0,否则 为1
            System.out.println(i ^ j); //01(2进制) -> 1(10进制)
    
            //左移位<<1 向左移位1位,最低位补0,原来的第二高位现在成为最高位
            System.out.println(i << 1); //0011 移位后 0110,对应10进制的6
    
            //右移位>>1 向右移位1位,最高位补上符号位,且不变
            /*
                移位前 11111111 11111111 11111111 11111101(补码)
                移位后 11111111 11111111 11111111 11111110(补码),
                对应原码 10000000 00000000 00000000 00000010
            */
            System.out.println(k >> 1); //-2(10进制)
    
            //无视符号右移位>>>1 向右移位1位,最高位补上0
            /*
                移位前 11111111 11111111 11111111 11111101(补码)
                移位后 01111111 11111111 11111111 11111110(补码),
                对应原码 01111111 11111111 11111111 11111110
            */
            System.out.println(k >>> 1); //2147483646即2^31-1-1(10进制)
    
            /*
                按位非的流程:
                00000000 00000000 00000000 00000010  1.2的2进制(这里是补码,因为是正数,所以和原码一样)
                11111111 11111111 11111111 11111101  2.位非
                11111111 11111111 11111111 11111100  3.取原码  (-1)
                10000000 00000000 00000000 00000011  3.取原码  (取反)
            */
            System.out.println(~j); //-3(10进制)
        }

    这里需要知道原码补码反码的一些知识,https://www.jianshu.com/p/129f9daae472(个人觉得这篇文章讲得不错)

  • 相关阅读:
    17111 Football team
    Train Problem I (HDU 100题纪念)
    迷宫问题
    图形点扫描
    看病要排队(stl)
    水果
    Prime Ring Problem
    N皇后问题
    2^x mod n = 1
    Queuing
  • 原文地址:https://www.cnblogs.com/lujiannt/p/9242297.html
Copyright © 2020-2023  润新知